Как правильно показать список видео?

Я всюду искал решение, но оно зашло в тупик. Пожалуйста помоги!

Я записываю и сохраняю видео следующим образом:

File DirectoryFile = new File(VideoPath);
recorder.setOutputFile(DirectoryFile.getAbsolutePath());

Я загружаю все видео и устанавливаю адаптер ListView из userPath следующим образом:

private File[] getNewImageFilesWithFilters() {
    File directory = new File(UserSavedDirectoryPATH);
    return directory.listFiles(new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.toLowerCase(Locale.getDefault()).endsWith(".mp4") 
                || name.toLowerCase(Locale.getDefault()).endsWith(".mkv");
        }
    });
}   

public void LoadListView() {
    for (File file : listFile){
        mVideoListViewObject = new VideoListViewObject();
        mVideoListViewObject.setName(file.getName());
        mVideoListViewObject.setVideoUrl(file.getAbsolutePath());
        VideoListViewObject_List.add(mVideoListViewObject); 
    }        
    mVideoListViewAdapter = new VideoListAdapter(this, VideoListViewObject_List);
    mListView.setAdapter(mVideoListViewAdapter); 
} 

Адаптер ListView:

public class VideoListAdapter extends BaseAdapter {
    private List<VideoListViewObject> VideoObjectList;
    private Context mContext;

    public VideoListAdapter(Context context, List<VideoListViewObject> newList){
        this.mContext = context;
        this.VideoObjectList = newList;
    }

    @Override
    public int getCount() {
        return VideoObjectList.size();
    }

    @Override
    public VideoListViewObject getItem(int position) {
        return VideoObjectList.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {       
      ViewHolder viewHolder = new ViewHolder();

      LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      if (convertView == null) {
          convertView = inflater.inflate(R.layout.listview_layout, parent, false);
          viewHolder.imageView = (ImageView)convertView.findViewById(R.id.ListViewImage); 
          viewHolder.layout = (RelativeLayout)convertView.findViewById(R.id.ListViewLayout);
          convertView.setTag(viewHolder);            
      } 
     else 
      {
         viewHolder = (ViewHolder)convertView.getTag();
      }

      Bitmap bmThumbnail = ThumbnailUtils.createVideoThumbnail(VideoObjectList.get(position).getVideoUrl(),Thumbnails.MICRO_KIND);    
      viewHolder.imageView.setImageBitmap(bmThumbnail);

Проблема в том, что список загружается медленно, особенно когда видео много. Это заставляет мой VideoaActivity запускаться очень медленно.

Я люблю Piscasso и Universal Image Loader, но они поддерживают только изображения.

Кто-нибудь знает лучшее решение или библиотеку, которая поможет с производительностью?

Большое спасибо.

1 ответ

Решение

Я просто изменил свое собственное приложение, чтобы сделать аналогичную логику, чтобы предварительно создать миниатюры, благодаря которым список с самого начала очень быстро прокручивался, добавьте растровое изображение миниатюры в videoListViewObject и создайте миниатюру при загрузке списка видео. таким образом, вам не нужно создавать его каждый раз, когда getView вызывается в вашем адаптере.

public class VideoListViewObject{

  private Bitmap bitmap = null;

............................

    public void setBitmap(Bitmap bitmap)
    {
      this.bitmap = bitmap;
    }
    public Bitmap getBitmap()
    {
      return this.bitmap;
    }

}


public void LoadListView() {
    for (File file : listFile){
        mVideoListViewObject = new VideoListViewObject();
        mVideoListViewObject.setName(file.getName());
        mVideoListViewObject.setVideoUrl(file.getAbsolutePath());
        Bitmap bmThumbnail = ThumbnailUtils.createVideoThumbnail(VideoObjectList.get(position).getVideoUrl(),Thumbnails.MICRO_KIND);    
        mVideoListViewObject.setBitmap(bmThumbnail);
        VideoListViewObject_List.add(mVideoListViewObject); 
    }        
    mVideoListViewAdapter = new VideoListAdapter(this, VideoListViewObject_List);
    mListView.setAdapter(mVideoListViewAdapter); 
} 

затем измените код BaseAdapter, чтобы создать миниатюру, только если она пуста,

public class VideoListAdapter extends BaseAdapter {
    private List<VideoListViewObject> VideoObjectList;
    private Context mContext;

    public VideoListAdapter(Context context, List<VideoListViewObject> newList){
        this.mContext = context;
        this.VideoObjectList = newList;
    }

    @Override
    public int getCount() {
        return VideoObjectList.size();
    }

    @Override
    public VideoListViewObject getItem(int position) {
        return VideoObjectList.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {       
      ViewHolder viewHolder = new ViewHolder();

      LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      if (convertView == null) {
          convertView = inflater.inflate(R.layout.listview_layout, parent, false);
          viewHolder.imageView = (ImageView)convertView.findViewById(R.id.ListViewImage); 
          viewHolder.layout = (RelativeLayout)convertView.findViewById(R.id.ListViewLayout);
          convertView.setTag(viewHolder);            
      } 
     else 
      {
         viewHolder = (ViewHolder)convertView.getTag();
      }

      VideoListViewObject  mVideoListViewObject = getItem(position);
      Bitmap  bmThumbnail = mVideoListViewObject.getBitmap();
      if(bmThumbnail==null)
      {
        bmThumbnail = ThumbnailUtils.createVideoThumbnail(VideoObjectList.get(position).getVideoUrl(),Thumbnails.MICRO_KIND);    
      }
      viewHolder.imageView.setImageBitmap(bmThumbnail);
Другие вопросы по тегам