2016-12-01 8 views
0

В моем приложении, я показываю видео SD-карты в ListView. 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. Когда вы прокручиваете, просмотренные представления перерабатываются, поэтому в этих случаях представление НЕ является нулевым, но в приведенном выше коде вы ничего не делали, если представление не равно нулю. Я отправил ответ, дайте мне знать, если это ясно. – 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...