Я видел много похожих постов, пробовал так много разных предложений, но у меня ничего не получалось.
Я загружаю некоторые изображения в 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);
}
в любом случае это плохая практика, потому что это может повредить поток пользовательского интерфейса et c.
Я попытался установить HasStableIds на моем адаптере и переопределил
@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 при загрузке нового растрового изображения.