UIL, Picasso – изображения в адаптере всегда перезагружаются при остановке прокрутки

У меня есть ListView с текстом и большим изображением из Интернета. Элемент моего изображения имеет соответствующую ширину и высоту wrap_content .
Я попытался отобразить изображение в фоновом режиме с помощью UIL & Picasso . Оба они могут работать, но изображение всегда перезагружается, когда я прекращаю прокрутку, и это делает мерцание ListView
Это выглядит так:

Введите описание изображения здесь

Вы можете увидеть, что он перезагружает загруженные и кэшированные изображения, когда я прекращаю прокрутку (я прокручиваю вниз, а затем прокручиваю вверх) .
Как я могу предотвратить это?

  <ImageView android:id="@+id/imgFeed" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop"/> // UIL options = new DisplayImageOptions.Builder() .showImageOnLoading(defaultImage) .showImageOnFail(defaultImage) .showImageForEmptyUri(defaultImage) .resetViewBeforeLoading(false) .cacheOnDisk(true).delayBeforeLoading(0) .displayer(new FadeInBitmapDisplayer(200)).cacheInMemory(true).imageScaleType(ImageScaleType.EXACTLY_STRETCHED).build(); ImageAware imageAware = new ImageViewAware(viewHolder.imgFeed, false); ImageLoader.getInstance().displayImage(item.getPhotoUrl(), imageAware, options); // Picasso Picasso.with(getContext()) .load(item.getPhotoUrl()) .placeholder(R.drawable.place_holder_big) .resize(screenWidth, 0) //set max width .into(viewHolder.imgFeed); 

Для UIL я пробовал много способов в этом вопросе, но они вообще не работают для меня.

Обновление : похоже, я столкнулся с проблемой кэширования памяти, подобной этому вопросу . Но как я могу исправить эту проблему? Посмотрите на приложение Facebook, они сделали это очень хорошо. Все изображения имеют разные размеры с шириной посадки и очень гладкую прокрутку без перезагрузки изображений. Как они могут это сделать?

Solutions Collecting From Web of "UIL, Picasso – изображения в адаптере всегда перезагружаются при остановке прокрутки"

Если вам интересно, как Facebook это сделал, они фактически выпустили свою библиотеку загрузки изображений ( https://github.com/facebook/fresco )

Возможно ли, что вы на самом деле вызываете notifyDataSetChanged в базовом ListView в это время? Также вы используете hasStableIds ()?

Для UIL вы можете попробовать использовать WeakMemoryCache (см. https://github.com/nostra13/Android-Universal-Image-Loader/wiki/Useful-Info ), поскольку это теоретически позволит вам использовать всю доступную память, хотя Это может вызвать много дополнительных вызовов GC.

Для метода Пикассо Таха выглядит как ваш лучший выбор!

Возможно, ваш размер кеша памяти мал, и Пикассо пытается загрузить изображения из кеша диска. Пожалуйста, проверьте здесь, чтобы определить размер кеша. Вы можете попытаться увеличить размер кеша Пикассо:

 Picasso p = new Picasso.Builder(context) .memoryCache(new LruCache(cacheSize)) .build(); 

Однако, на мой взгляд, ваше приложение выглядит как бесконечный фид. Это означает, что ваш кеш памяти будет заполнен в какое-то время, и вам придется использовать кеш диска. Извлечение данных из кеша диска происходит медленнее по сравнению с кешем памяти.