2016-12-01 2 views
0

In meiner App zeige ich die SD-Karte Videos in der ListView. ListView zeigt Video-Vorschaubilder, Titel, Größe und Dauer an. Wenn ich nach unten scrolle, werden die gleichen Videos und Thumbnails angezeigt, aber wenn ich auf ein Element klicke, wird die andere Videodatei für eine andere Aktivität angezeigt. Ich möchte das nur in der ListView, wo das aktuelle Video zeigt, ob ich nach unten oder oben scrolle.ListView zeigt nicht die tatsächlichen Videodateien nach dem Bildlauf nach unten

Hier ist mein Code.

public class loadvideo erweitert 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

Sind Sie auch doppelte thumbnails/Daten sehen? – Hahn

+0

genau die ersten 6 oder 7 Elemente sind tatsächlich dann ist alles gleich wie zuvor. Kannst du mir bitte sagen, warum das passiert? @Hahn –

+0

Das Problem besteht darin, dass Sie alle Daten/Bilder NUR einstellen, wenn die Ansicht null ist. Wenn Sie einen Bildlauf durchführen, werden die bereits erstellten Ansichten wiederverwendet. In diesen Fällen ist die Ansicht NICHT NULL, aber Sie haben im obigen Code nichts getan, wenn eine Ansicht nicht null ist. Ich habe eine Antwort geschrieben, lass es mich wissen, wenn es klar ist – Hahn

Antwort

0

Von diesem Punkt: if(view == null), ändern Sie den Code wie:

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... 
Verwandte Themen