Ленивая загрузка изображений в ListView - PullRequest
1845 голосов
/ 12 февраля 2009

Я использую ListView для отображения некоторых изображений и подписей, связанных с этими изображениями. Я получаю изображения из Интернета. Есть ли способ ленивой загрузки изображений, чтобы при отображении текста пользовательский интерфейс не блокировался и изображения отображались по мере загрузки?

Общее количество изображений не фиксировано.

Ответы [ 39 ]

39 голосов
/ 12 февраля 2009

Я делаю это, запуская поток, чтобы загрузить изображения в фоновом режиме и передать ему обратный вызов для каждого элемента списка. Когда загрузка изображения завершена, он вызывает функцию обратного вызова, которая обновляет представление для элемента списка.

Однако этот метод работает не очень хорошо, когда вы перерабатываете представления.

31 голосов
/ 14 декабря 2011

Я просто хочу добавить еще один хороший пример, Адаптеры XML . Поскольку он используется Google, и я также использую ту же логику, чтобы избежать ошибки OutOfMemory.

В основном этот ImageDownloader является вашим ответом (поскольку он покрывает большинство ваших требований). Некоторые из них вы также можете реализовать в этом.

28 голосов
/ 13 июня 2013

Я использую NetworkImageView из новой библиотеки Android Volley com.android.volley.toolbox.NetworkImageView, и, похоже, она работает довольно хорошо. По-видимому, это тот же самый вид, который используется в Google Play и других новых приложениях Google. Определенно стоит проверить.

27 голосов
/ 16 октября 2013

Это распространенная проблема на Android, которая была решена многими людьми многими способами. На мой взгляд, лучшее решение, которое я видел, - это относительно новая библиотека под названием Picasso . Вот основные моменты:

  • Открытый исходный код, но возглавляемый Jake Wharton из ActionBarSherlock славой.
  • Асинхронная загрузка изображений из сетевых ресурсов или ресурсов приложения с помощью одной строки кода
  • Автоматически ListView Обнаружение
  • Автоматическое кэширование диска и памяти
  • Может делать пользовательские преобразования
  • Много настраиваемых опций
  • Супер простой API
  • Часто обновляемые
25 голосов
/ 12 февраля 2013

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

Это мой код:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.row, null);
    }

    ImageView imageview = (ImageView) v.findViewById(R.id.icon);
    AQuery aq = new AQuery(convertView);

    String imageUrl = "http://www.vikispot.com/z/images/vikispot/android-w.png";

    aq.id(imageview).progress(this).image(imageUrl, true, true, 0, 0, new BitmapAjaxCallback() {
        @Override
        public void callback(String url, ImageView iv, Bitmap bm, AjaxStatus status) {
            iv.setImageBitmap(bm);
        }
    ));

    return v;
}

Это должно решить вашу проблему с отложенной загрузкой.

24 голосов
/ 11 декабря 2012

Я думаю, что эта проблема очень популярна среди разработчиков Android, и существует множество таких библиотек, которые утверждают, что решили эту проблему, но только некоторые из них, кажется, находятся на высоте. AQuery - одна из таких библиотек, но она лучше, чем большинство из них во всех аспектах, и ее стоит попробовать.

21 голосов
/ 05 февраля 2015

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

Универсальный загрузчик изображений

Особенности

  • Многопоточная загрузка изображений (асинхронная или синхронная)
  • Широкая настройка конфигурации ImageLoader (исполнители потоков, загрузчик, декодер, память и дисковый кеш, опции отображения изображений и т. Д.)
  • Множество параметров настройки для каждого вызова изображения дисплея (заглушки, переключатель кэширования, параметры декодирования, обработка и отображение растровых изображений и т. Д.)
  • Кэширование изображений в памяти и / или на диске (файловая система устройства или SD-карта)
  • Прослушивание процесса загрузки (включая процесс загрузки)

Поддержка Android 2.0+

enter image description here

20 голосов
/ 16 октября 2012

Взгляните на Shutterbug , облегченный порт Appwidium SDWebImage (хорошая библиотека на iOS) для Android. Он поддерживает асинхронное кэширование, сохраняет сбойные URL-адреса, хорошо обрабатывает параллелизм и содержит полезные подклассы.

Также приветствуются запросы на извлечение (и сообщения об ошибках)!

16 голосов
/ 06 мая 2013

DroidParts имеет ImageFetcher , для начала которого требуется нулевая конфигурация.

  • Использует диск и в памяти Наименее недавно использованный (LRU) кеш.
  • Эффективно декодирует изображения.
  • Поддерживает изменение растровых изображений в фоновом потоке.
  • Имеет простое затухание.
  • Имеет функцию обратного вызова процесса загрузки изображения.

Клон DroidPartsGram для примера:

Enter image description here

16 голосов
/ 03 августа 2014

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

Существует четыре основных способа.

  1. DIY => Не лучшее решение, но для нескольких изображений, и если вы хотите обойтись без использования других библиотек

  2. Volley's Lazy Загрузка библиотеки => От парней на андроид. Это хорошо и все, но плохо документировано и, следовательно, является проблемой для использования.

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

  4. UIL: лучший способ ленивой загрузки изображений. Вы можете кэшировать изображения (вам, конечно, нужно разрешение), один раз инициализировать загрузчик, а затем выполнить свою работу. Самая зрелая библиотека асинхронной загрузки изображений, которую я когда-либо видел.

...