我看到许多类似的帖子都尝试了许多不同的建议,但对我没有任何帮助。
我正在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仍然闪烁。