android - 在带有图像的 ListView 中延迟加载。 (游标适配器)

标签 android

我有一个显示视频及其缩略图的 ListView ,我正在使用光标适配器(使用 ContentProvider 获取)。问题是随着列表项数量的增加, ListView 性能变得非常差。请让我知道延迟加载的最佳方法。

新: 最后我得到了一些解决方案。它对我来说很好用。如果您有任何建议,请告诉我。 我的新代码在这里。 (它使用堆栈与生产者消费者模式和免费线程进行处理)

@覆盖 public void bindView(View view, Context context, Cursor 游标) {

    ViewHolder holder = (ViewHolder) view.getTag();
    String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
    int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
    holder.getIdView().setText(name);
    holder.getThumbView().setTag((Integer)id);
    if(LazyLoader.getInstance().containsKey(id)) {
        Object bitmap = LazyLoader.getInstance().getBitMap(id);
        if(null != bitmap && (bitmap instanceof  Bitmap)) {
            holder.getThumbView().setImageBitmap((Bitmap)bitmap);
        } else {
            holder.getThumbView().setImageDrawable(null);
        }
    } else {
        holder.getThumbView().setImageDrawable(null);
        LazyItem lazyItem = new LazyItem();
        lazyItem.setId(id);
        lazyItem.setThumbNail(holder.getThumbView());
        LazyLoader.getInstance().putItem(lazyItem);
    }
}




public class LazyLoaderHelper extends Thread {

    private ContentResolver resolver = null;
    private Activity activity;
    private boolean isActive = true;
    ExecutorService executor;


    public LazyLoaderHelper(Activity _activity , ContentResolver _resolver) {
        resolver = _resolver;
        activity = _activity;
        isActive = true;
        executor = Executors.newFixedThreadPool(10);
    }

    public void stopThread() {
        isActive = false;
        executor.shutdown();
    }

    @Override
    public void run() {
        while (isActive) {
            if(LazyLoader.getInstance().getSize() > 0) {
                final  LazyItem lazyItem = LazyLoader.getInstance().getItem();
                if(null != lazyItem) {

                    executor.execute(new Runnable() {
                        @Override
                        public void run() {

                            BitmapFactory.Options options = new BitmapFactory.Options();
                            options.inSampleSize = 1;

                            if ((null != resolver) && (null != activity)) {
                                final Bitmap thumb = MediaStore.Video.Thumbnails.getThumbnail(resolver, lazyItem.getId(), MediaStore.Video.Thumbnails.MICRO_KIND, options);
                                if (null != thumb) {
                                    LazyLoader.getInstance().putBitMap(lazyItem.getId(), thumb);
                                } else {
                                    LazyLoader.getInstance().putBitMap(lazyItem.getId(), new Object());
                                }

                                if ((Integer) lazyItem.getThumbNail().getTag() == lazyItem.getId()) {
                                    activity.runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            if (null != thumb) {
                                                lazyItem.getThumbNail().setImageBitmap(thumb);
                                            } else {
                                                lazyItem.getThumbNail().setImageDrawable(null);
                                            }
                                        }
                                    });
                                }
                            }
                        }
                    });
                }
            }

        }
    }
}

最佳答案

您可以使用适用于 Android 的 picaso 库,它是开源的,可以轻松集成到您的应用程序中,您可以从以下链接从 github 下载该库

http://square.github.io/picasso/

并且可以通过在 ListView 适配器中使用以下方法轻松实现延迟加载

Picasso 支持下载和错误占位符作为可选功能。

Picasso.with(上下文) .load(网址) .placeholder(R.drawable.user_placeholder) .error(R.drawable.user_placeholder_error) .into( ImageView );

资源、 Assets 、文件、内容提供者都支持作为图像源。

Picasso.with(context).load(R.drawable.landing_screen).into(imageView1); Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2); Picasso.with(context).load(new File(...)).into(imageView3);

关于android - 在带有图像的 ListView 中延迟加载。 (游标适配器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31558907/

相关文章:

java.lang.RuntimeException : Unable to instantiate activity ComponentInfo for Kotlin MainActivity 错误

java - SharedPreferences 被随机删除

android - 错误的列表项被删除而不是使用自定义列表适配器选择的项目

java - Android 中用于谷歌云数据存储的谷歌 protobuf api

android - 在 IntentService 中创建的 Toast 永远不会消失

android - 如何获取电子邮件?

android - 请帮我,我得到这个

android - 立即从适配器更新 ListView

java - 如何获取月份中的某一天?

java - 在 Android 中缩放 SVG?