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,則不會執行任何操作。我已經發布了一個答案,讓我知道如果它明確 – 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... 
相關問題