【问题标题】:Android video thumbnail displaying in a ListAdapter在 ListAdapter 中显示的 Android 视频缩略图
【发布时间】:2014-10-15 17:27:25
【问题描述】:

我目前正在将设备上的所有视频加载到自定义 ListAdapter 中,该 ListAdapter 显示视频的缩略图 + 更多内容。我注意到当我添加越来越多的视频时,启动速度会变慢。这是我的列表适配器的样子:

public class VideoListAdapter extends ArrayAdapter<Video> {

    private ArrayList<Video> allVideos;
    private HashMap<String, Bitmap> bitmapCache;

    public VideoListAdapter(Context context, ArrayList<Video> videos) {
        super(context, R.layout.video_list_item, videos);
        this.allVideos = videos;
        /* Cache the thumbnails */
        setUpBitmaps();
    }

    private void setUpBitmaps() {
        bitmapCache = new HashMap<String, Bitmap>(allVideos.size());
        for(Video video : allVideos){
            bitmapCache.put(video.getDATA(), ThumbnailUtils.createVideoThumbnail(video.getDATA(), Thumbnails.MICRO_KIND));
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View row;
        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            row = inflater.inflate(R.layout.video_list_item, null);
        } else {
            row = convertView;
        }

        Video tmpVideo = allVideos.get(position);

        String TITLE = tmpVideo.getTITLE();
        long vidDur = Long.valueOf(tmpVideo.getDURATION());
        String DURATION = String.format(Locale.getDefault(),"%02d:%02d", 
                TimeUnit.MILLISECONDS.toMinutes(vidDur) -  
                TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(vidDur)), 
                TimeUnit.MILLISECONDS.toSeconds(vidDur) - 
                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(vidDur)));

        String filepath = tmpVideo.getDATA();
        Bitmap thumbnail = bitmapCache.get(filepath);

        TextView tvTitle = (TextView) row.findViewById(R.id.tvListItemVideoTitle);
        TextView tvDuration = (TextView) row.findViewById(R.id.tvListItemVideoDuration);
        ImageView ivThumbnail = (ImageView) row.findViewById(R.id.ivListItemVideoThumbnail);

        tvTitle.setText(TITLE);
        tvDuration.setText(DURATION);
        if(thumbnail != null){
            ivThumbnail.setImageBitmap(thumbnail);
        }

        return row;
    }
}

应该如何加载缩略图以减少加载列表适配器所需的时间?目前在我的设备上,显示适配器的活动需要 3-4 秒才能显示,而我只有大约 15 个视频。

任何建议将不胜感激。

马库斯

【问题讨论】:

  • 使用库来缓存缩略图..而不是重新加载它们..这将减少时间
  • 你可以使用查询库..它会保存缩略图...
  • 也使用 ViewHolder 类进行视图初始化..

标签: android video android-mediaplayer


【解决方案1】:

不是在列表视图中显示视频,而是通过传递视频路径获取视频的缩略图并将它们显示在列表视图中。使用此代码获取缩略图。并且还可以使用lazylist来正​​确显示图片。

Bitmap thumb = ThumbnailUtils.createVideoThumbnail(path,
MediaStore.Images.Thumbnails.MINI_KIND);

【讨论】:

【解决方案2】:
You can use lazyloading for this,LazyLoading will make your list scroll fast.Follow this library it will help:

https://github.com/nostra13/Android-Universal-Image-Loader

Steps of using lazy loading :

1.)Download jar file from this link:
http://www.java2s.com/Code/Jar/u/Downloaduniversalimageloader161withsrcjar.htm

2.)Create Application File :
import android.app.Application;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // UNIVERSAL IMAGE LOADER SETUP
        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheOnDisc(true).cacheInMemory(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .displayer(new FadeInBitmapDisplayer(300)).build();

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                getApplicationContext())
                .defaultDisplayImageOptions(defaultOptions)
                .memoryCache(new WeakMemoryCache())
                .discCacheSize(100 * 1024 * 1024).build();

        ImageLoader.getInstance().init(config);
        // END - UNIVERSAL IMAGE LOADER SETUP
    }
}

3.)On your activity in whcih you want to use ,write this it onCreate():

DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.iclauncher) // resource or
                                                                // drawable
                .showImageForEmptyUri(R.drawable.iclauncher) // resource or
                // drawable
                .showImageOnFail(R.drawable.iclauncher) // resource or
                                                            // drawable
                .resetViewBeforeLoading(false) // default
                .delayBeforeLoading(1000).cacheInMemory(true) // default
                .cacheOnDisc(true) // default
                .considerExifParams(true) // default
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT) // default
                .bitmapConfig(Bitmap.Config.ARGB_8888) // default
                .displayer(new SimpleBitmapDisplayer()) // default
                .handler(new Handler()) // default
                .build();
        imageLoader = ImageLoader.getInstance();

4.)on your adapter write this: 

    imageLoader.displayImage(alist.get(position).getThumbnails(),
                    holder.ivImage, options, null); // alist.get(position).getThumbnails() is the url of the thumbnail and holder.ivImage is the reference of the imageview where thumbnail is to be placed

【讨论】:

  • 我的滚动速度很快,但加载适配器需要时间
  • 延迟加载也有助于快速加载适配器
  • 如果我想自己实现这个,你能指出我正确的方向吗?
  • 如果你愿意,我可以逐步写下延迟加载的用法
  • 是的,那太好了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2014-06-24
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多