2016-12-01 12 views
0

私のアプリでは、ListViewにSDカードのビデオを表示しています。 ListViewは、ビデオのサムネイル、タイトル、サイズ、期間を表示します。下にスクロールすると同じビデオとサムネイルが表示されますが、アイテムをクリックすると別の動画ファイルが別のアクティビティに表示されます。私はちょうどListViewで実際のビデオは私がスクロールダウンかどうかを表示します。ListViewはスクロールダウン後の実際のビデオファイルを表示しません

ここに私のコードです。

LoadVideoは、この点からAppCompatActivity {

private Cursor videoCursor; 
private int video_column_index; 
ListView videoList; 
int count; 
String[] thumbColumns = {MediaStore.Video.Thumbnails.DATA, 
     MediaStore.Video.Thumbnails.VIDEO_ID}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.load_video_activity); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    init_phone_video_grid(); 
} 

private void init_phone_video_grid() 
{ 
    String[] proj = {MediaStore.Video.Media._ID, 
      MediaStore.Video.Media.DATA, 
      MediaStore.Video.Media.DISPLAY_NAME, 
      MediaStore.Video.Media.SIZE, 
      MediaStore.Video.Media.DURATION}; 

    videoCursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj, null, null, null); 
    count = videoCursor.getCount(); 

    videoList = (ListView) findViewById(R.id.videoList); 
    videoList.setAdapter(new VideoAdapter(this.getApplicationContext())); 
    videoList.setOnItemClickListener(videoGridListener); 
} 

private AdapterView.OnItemClickListener videoGridListener = new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

     video_column_index = videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); 
     videoCursor.moveToPosition(i); 
     String fileName = videoCursor.getString(video_column_index); 
     Intent intent = new Intent(LoadVideo.this, ShowVideo.class); 
     intent.putExtra("videofilename", fileName); 
     startActivity(intent); 
    } 
}; 

public class VideoAdapter extends BaseAdapter 
{ 
    Context context; 

    VideoAdapter(Context context) 
    { 
     this.context = context; 
    } 

    @Override 
    public int getCount() { 
     return count; 
    } 

    @Override 
    public Object getItem(int i) { 
     return i; 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) 
    { 
     ViewHolder viewHolder; 
     String id; 

     if (view == null) 
     { 
      viewHolder = new ViewHolder(); 
      view = LayoutInflater.from(context).inflate(R.layout.list_items, viewGroup, false); 

      viewHolder.titleName = (TextView) view.findViewById(R.id.title); 
      viewHolder.duration = (TextView) view.findViewById(R.id.duration); 
      viewHolder.size = (TextView) view.findViewById(R.id.size); 
      viewHolder.thumbImage = (ImageView) view.findViewById(R.id.imageIcon); 

      //Title 
      video_column_index = videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME); 
      videoCursor.moveToPosition(i); 
      id = videoCursor.getString(video_column_index); 
      viewHolder.titleName.setText(id); 

      //Size 
      video_column_index = videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE); 
      videoCursor.moveToPosition(i); 

      String vSize; 
      long videoSize = videoCursor.getLong(video_column_index); 
      double actualSizeInMB = videoSize/(1024.0 * 1024.0); 
      DecimalFormat dec = new DecimalFormat("0.00"); 

      if (actualSizeInMB > 1) 
      { 
       vSize = dec.format(actualSizeInMB).concat(" MB"); 
       viewHolder.size.setText(vSize); 
      } 
      else 
      { 
       vSize = dec.format(actualSizeInMB).concat(" KB"); 
       viewHolder.size.setText(vSize); 
      } 

      //Duration 
      video_column_index = videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION); 
      videoCursor.moveToPosition(i); 
      long time = videoCursor.getLong(video_column_index); 
      long seconds = time/1000; 
      long minutes = seconds/60; 
      seconds = seconds % 60; 
      String setTime ; 
      if (seconds < 10) 
      { 
       setTime = String.valueOf(minutes) + ":0" + String.valueOf(seconds); 
       viewHolder.duration.setText(setTime.concat(" | ")); 
      } 
      else 
      { 
       setTime = String.valueOf(minutes) + ":" + String.valueOf(seconds); 
       viewHolder.duration.setText(setTime.concat(" | ")); 
      } 

      //String[] proj = { MediaStore.Video.Media._ID, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.DATA }; 
      //Cursor cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj, 
        //MediaStore.Video.Media.DISPLAY_NAME + "=?", new String[] { id }, null); 
      //cursor.moveToFirst(); 
      //long ids = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media._ID)); 

      long ids = videoCursor.getInt(videoCursor.getColumnIndex(MediaStore.Video.Media._ID)); 
      ContentResolver crThumb = getContentResolver(); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = 1; 
      Bitmap curThumb = MediaStore.Video.Thumbnails.getThumbnail(crThumb, ids, MediaStore.Video.Thumbnails.MICRO_KIND, options); 
      viewHolder.thumbImage.setImageBitmap(curThumb); 
      curThumb = null; 

      //video_column_index = videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); 
      //videoCursor.moveToPosition(i); 
      //String path = videoCursor.getString(video_column_index); 
      //Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Video.Thumbnails.MICRO_KIND); 
      //viewHolder.thumbImage.setImageBitmap(thumbnail); 

      //videoThumbnailCursor.close(); 

     } 

     return view; 
    } 

    private class ViewHolder 
    { 
     TextView titleName; 
     TextView size; 
     TextView duration; 
     ImageView thumbImage; 
    } 
} 

}

+0

あなたも重複サムネイル/データを見ていますか? – Hahn

+0

正確に最初の6または7の項目が実際のものであり、すべてが以前と同じです。なぜこれが起こっているのか教えてください。 @Hahn –

+0

問題は、ビューがnullの場合のみすべてのデータ/イメージを設定していることです。スクロールすると、すでに作成されたビューがリサイクルされるので、ビューはnullではありませんが、上記のコードでは、ビューがnullでない場合は何もしませんでした。私は答えを掲示して、それが明確であれば教えてください – Hahn

答えて

0

を拡張するパブリック・クラス:if(view == null)は、同じようにコードを変更します。

if (view == null) { 
     viewHolder = new ViewHolder(); 
     view = LayoutInflater.from(context).inflate(R.layout.list_items, viewGroup, false); 
     viewHolder.titleName = (TextView) view.findViewById(R.id.title); 
     viewHolder.duration = (TextView) view.findViewById(R.id.duration); 
     viewHolder.size = (TextView) view.findViewById(R.id.size); 
     viewHolder.thumbImage = (ImageView) view.findViewById(R.id.imageIcon); 
     view.setTag(viewHolder); 

} else { 

     viewHolder = (ViewHolder)(view.getTag()); 
} 
//Title.....and so on... 
関連する問題