Подтвердить что ты не робот

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

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

enter image description here

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

 <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, они сделали это очень хорошо. Все изображения имеют разные размеры с шириной посадки и очень гладкую прокрутку без перезагрузки изображений. Как они могут это сделать?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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