Intereting Posts
Как получать уведомление, когда уведомление уведомляется ProgressBar в панели действий Как отключить экран или отправить устройство в режим сна Parse SDK Android – Facebook Graph API v2.0 Поддержка MultiDex в приложении Android-приложения Как хранить объект JSON в базе данных SQLite Пользователь не имеет права на эту покупку – в биллинге приложения Почему метод start () MediaRecorder генерирует исключение IllegalStateException? Выбирайте арабскую / урдускую пользовательскую клавиатуру на Edittext Issue Android Studio: ошибка анализа XML и URI не зарегистрирована Как вызвать json webservice через андроид Проблема выбора списка выбора одного Android? Android – Скрыть все отображаемые сообщения о Toast Установленное соединение было прервано программным обеспечением вашей хост-машины Как заставить широковещательный приемник приложения продолжать прослушивание без использования службы в фоновом режиме

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(); 

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