Ленивая загрузка изображений очень медленно в LIstView
Я реализовал отложенную загрузку изображений (с удаленного сервера) в своем приложении (приложение типа твиттера), и часть извлечения и загрузки изображения в точный imageView работает отлично. Но часть "getView" адаптера вызывается только после того, как я прокручиваю ListView, и поэтому изображения выбираются с удаленного сервера (я выбираю изображения, выполняя asyntask внутри кода "getView" адаптера) только после того, как прокручиваю вниз и могу увидеть значительную задержку в загрузке изображений. После того как изображения загружены и сохранены в кэш-памяти, при прокрутке вверх или вниз проблем не возникает. Единственная проблема - медленная загрузка изображений при первой загрузке.
Итак, есть ли способ исправить это так, чтобы к тому времени, когда я прокручиваю вниз, я смогу получить растровое изображение и установить растровое изображение при прокрутке вниз. Я хочу, чтобы это было похоже на твиттер-приложение, где я не мог видеть отставание при загрузке фотографий профиля.
ТИА
3 ответа
Если вы вызываете свой веб-сервис в методе getView(), он будет вызываться каждый раз при прокрутке вверх и вниз. Так как метод getView вызывается для строк, которые видны на экране.
Что вы можете сделать, это загрузить изображения в HashMap<int, Object>
где int == позиция в списке, а object - изображение. В getview вы можете проверить, были ли загружены позиции + (1 -> 10), и, если нет, извлечь их из веб-сервиса в какой-то фоновой задаче. Загрузите изображения в hashmap и заставьте метод getView() использовать эти изображения. Не изображения, полученные непосредственно из веб-службы. В противном случае вам действительно придется ждать их извлечения. Также таким образом вы кэшируете изображения в хэш-карте вместо того, чтобы многократно извлекать одни и те же изображения при прокрутке вверх и вниз.
Конечно, уже есть люди, которые сделали такие адаптеры, просто по его поиску я нашел этот SO вопрос, ответ на который имеет отношение к бесконечному адаптеру CommonsWare.
Существует библиотека под названием AALP, которую вы можете использовать, чтобы помочь вам с отложенной загрузкой представлений списка. https://bitbucket.org/zedvoid/aalp/src Это может сэкономить вам время и усилия, надеюсь.
Итак, ваш подход неверен, вы должны получить все изображения, прежде чем показывать их как вызов get, который вызывается каждый раз, когда вы прокручиваете список, поэтому каждый раз, когда ваша служба вызывается и получает нет. изображений, которые список может отображать на экране (скажем, 4-5 за один раз).
Что вам нужно сделать, это:- 1) Получить все изображения. 2) Когда вы выбираете все изображения, установите адаптер на просмотр списка, и у вас будут все изображения в вашем списке без каких-либо задержек, так как вы уже загрузили изображения,
Но это не ленивая загрузка - ленивая загрузка означает, что пользователь должен видеть только часть изображений за раз, если он не прокручивает, нет смысла загружать изображения из сервиса.
Надеюсь, что это будет полезно