Recyclerview ImageView在加载的新图像上闪烁

时间:2020-03-05 14:07:34

标签: java android android-recyclerview android-glide flicker

我看到许多类似的帖子都尝试了许多不同的建议,但对我没有任何帮助。

我正在RecyclerView中加载一些图像,当我用Picasso或Glide加载它们时,我得到的结果是相同的。当我滚动RecyclerView时,正在闪烁。

对我而言唯一有效的解决方案是将图像预先缓存在其他线程中,等待其结束并将其存储在列表中,然后在BindViewHolder

中填充视图
Thread glideThread = new Thread(() -> {

        for (int i = 0; i < imagesUrls.size(); i++) {
            Future<Bitmap> futureBitmap = Glide.with(context)
                    .asBitmap()
                    .load(entriesArrayList.get(i).getImageUrl())
                    .submit();
            try {
                imagesList.add(futureBitmap.get());
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    );
    glideThread.start();
    glideThread.join();
    if(!glideThread.isAlive())
    notifyDataSetChanged();

然后

for (Bitmap bitmap : imagesList) {
        holder.carouselImage.setImageBitmap(bitmap);
    }

无论如何这都是不好的做法,因为它可能会挂起UI线程等。

我尝试在适配器上设置setHasStableIds,并且覆盖了

@Override
public long getItemId(int position) {

    Log.d(TAG, "item id " + entriesArrayList.get(position).hashCode());
    return entriesArrayList.get(position).hashCode();
}

这是Glide的实现

Glide.with(context).load(entriesArrayList.get(position).getImageUrl())
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .placeholder(R.drawable.ic_logo_background)
            .dontAnimate()
            .into(holder.carouselImage);

什么也没发生。加载新的位图时,ImageView仍然闪烁。

0 个答案:

没有答案