Intereting Posts
Как использовать библиотеку / функции c / cpp в android Android: Как изменить уровень ведения журнала по умолчанию? Автоматизировать импорт проектов Java (Android) в рабочее пространство Eclipse через командную строку Ошибка Android: Ошибка: ресурс не найден, который соответствует указанному имени Как настроить ProGuard в Eclipse при экспорте подписанного, запутанного приложения для Android? Как выбрать уникальные контакты из Android Изменение имени пакета приложений через Android Studio Плавно Анимация пути камеры на карте Имя экрана Android-телефона перед отображением заставки Скопировать текст с Android AlertDialog? AndroidStudio – обновлено обновление Gradle Как вы можете настроить мягкую клавиатуру EditText для использования номеров вначале, но все же разрешить текст? Линейный макет с двумя кнопками бок о бок – андроид Компиляция ICU с использованием arm-linux-androideabi-4.4.3 Android takePersistableUriPermission не компилируется

Android: отключите ленивую загрузку списка

В моем приложении Android у меня есть список, содержащий 30 строк, и каждая строка состоит из нескольких текстовых просмотров, одна из которых является spannable и иногда содержит много форматированного текста и изображений.

Эти изображения загружаются из сети асинхронно: заполнитель отображается до тех пор, пока изображение не будет загружено, а затем заменяется изображением.

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

Как я могу отключить его, чтобы строки ListView загружались, когда я просматриваю их? Они должны быть загружены один раз, когда я начну свою деятельность и никогда больше не буду.

С наилучшими пожеланиями и благодарностью, Ян Оливер

Solutions Collecting From Web of "Android: отключите ленивую загрузку списка"

Когда вы выполняете ленивый ListView, это потому, что вы хотите ускорить его работу. Выключить это не лучшее решение. Итак, что вы можете сделать, это реализовать базовую систему кэширования, чтобы избежать повторной загрузки и настройки ImageView.

Самый простой способ сделать это – реализовать HashMap с URL-адресами в качестве ключей и растровых изображений в качестве значений. Что-то вроде этого:

Map cache = new HashMap(); // then, on your lazy loader Bitmap image = cache.get(urlOfTheImage); if( image == null ){ // download and decode the image as normal, // then assign the decoded bitmap to // the 'image' variable cache.put(image); } imageView.setImageBitmap(image); 

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

С другой стороны, если изображения имеют тенденцию к изменению, вы можете реализовать некоторые интересные вещи: используйте SoftReferences . В этом видео есть объяснение. Это также можно использовать, если вы загружаете изображения из файловой системы.

редактировать

Что касается вашего комментария, я настоятельно рекомендую вам посмотреть видео, которое я разместил. Это час, но это действительно стоит усилий. При использовании адаптера проверка того, что convertView равна нулю, – это просто простой способ повысить производительность, хотя есть и другие методы, которые еще больше улучшат ваше приложение. Кроме того, если у вас были проблемы при использовании этого трюка, это связано с тем, что вы, вероятно, используете его неправильно. Помните: даже если вы не заново раздуваете представления, вам нужно установить значение каждого из представлений детей, иначе вы столкнетесь с некоторыми проблемами.

Если вы можете, начните с массива изображений, полного «изображений-заполнителей», а затем загрузите изображения в массив, запускающий AsyncTask во время создания. Во время построения строк просто ссылайтесь на массив. Таким образом, если у него будет новый образ, он загрузит его, если он не получит местозаполнитель.

Если у вас будет много данных, он будет очень медленным и станет для вас непонятным временем.

Создайте список объектов, представляющих каждую строку. Создайте загрузчик в качестве фонового потока, который обновляет объекты при загрузке данных. В вашем представлении списка будут отображаться данные из объектов.

(Не очень хорошая идея, если у вас есть сотни строк и огромное количество данных в каждой строке – в этом случае вы должны загружать только данные в несколько строк текущей активной строки и иметь какой-то кеш MRU).