我该如何异步填充我的RecyclerView?

时间:2016-05-16 15:41:29

标签: android

问题

我的RecyclerView显示带有照片的元素。每张照片都是从互联网上下载的,这可能需要几秒钟的时间。因此,我尝试避免阻止UI线程并将工作传递给Handler,但是,由于RecyclerView的回收行为,它会不正确地显示图像。

这就是它的样子:

将图像1加载到列表项目1。

将图像2加载到列表项目2。

我向下滚动。

将图像3加载到列表项目20。

将图像4加载到列表项目21。

将图像4加载到列表项目20。

将图像5加载到列表项目21。

最后一切都还可以,但在加载过程中,RecyclerView会使用错误的图像回收ViewHolders!

我的代码

mHandler.post(new Runnable() {
        @Override
        public void run() {
            final Uri image = complexFetchingFunction();

            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    try {
                        holder.imageView.setImageURI(image);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    });

结束

Handler在单独的线程上工作。这是肯定的。 我知道所有这些事情都会发生,因为我异步加载图像而RecyclerView不喜欢它,但除此之外它很慢。

有没有人有解决方案?

3 个答案:

答案 0 :(得分:1)

我建议使用Glide。它将为您异步加载图像,并缓存它们。

举个例子,你可以这样使用它

Glide.with(context)
            .load("your_url")
            .into(your_imageview);

答案 1 :(得分:1)

来自Android文档 Processing Bitmaps Off the UI Thread

但我建议您使用 UIL 库在recyclerview中加载图片。这是最受欢迎和高效的库,易于集成。

特点:

多线程图像加载(异步或同步)

ImageLoader配置的广泛定制(线程执行器,下载器,解码器,内存和磁盘缓存,显示图像选项等)

每个显示图像调用的许多自定义选项(存根图像,缓存切换,解码选项,位图处理和显示等)

内存和/或磁盘上的图像缓存(设备的文件系统或SD卡) 听力加载过程(包括下载进度)

有关详细信息,请访问https://github.com/nostra13/Android-Universal-Image-Loader

您还可以尝试 GLIDE 。 Glide也支持GIF图像。

您可以比较图片加载器库 here

答案 2 :(得分:1)

使用Glide库。它是Google推荐的图书馆,也可用于各种Google应用,例如Google相册,环聊等。