2013-03-18 2 views
2

У меня есть настроенный список, и каждая строка, отображающая изображение, текст и изображение, должна быть загружена с сервера.Загрузка изображения только для видимой строки в виде списка

Итак, я настроил свой адаптер и в этом методе getView я начал задачу asyn для downlaoding изображения.

Но проблема в том, что если есть 50 пунктов в списке, если я прокручивать с 1-го по 50-й позиции в списке на одном дыхании,

затем для каждой строки, он начнет загрузку изображений независимо от тонка, что строка даже не показано ...

так что может быть решением для этого ???

Любая помощь будет высоко оценен

Благодаря

ответ

0

Это хорошо известная проблема. Прочтите Lazy Image Loading и найдите похожие проблемы. Это не так очевидная проблема, особенно когда вы добавляете использование convertView и т. Д.

Быстрое обходное решение для вас - я бы предложил загрузить изображения на ThreadExecutor с помощью max 4 потоков и отменить все задачи, которые больше не нужны. Когда вы используете convertView - вы можете прикрепить задачу к представлению с помощью setTag (asyncTask) и отменить его, когда новый отправляется. Вы также можете использовать кеш LRU для хранения некоторых изображений и не загружать их при каждом прокрутке списка.

-1

GetView вызывается только для видимых строк. Поэтому, если вы начнете загрузку, она будет загружать только просмотренные виды. Примечание. Никогда не вызывайте getView адаптера самостоятельно, вы вызовете основные проблемы listView.

+0

Я предполагаю, что я не понял ваше решение .... пожалуйста, помогите мне с этим .... Поскольку я прокручиваю, каждая рона видима для нас, поэтому нужно вызвать просмотр, и загрузка должна начинаться с него. .... так что если перейти к 50-му пункту, то ...... –

+0

Ну, если вы прокручиваете, вы будете собирать каждую строку, когда она станет видимой. Это ожидаемое поведение. Если вы не прокручиваете, вы не ставите эти запросы. Это ожидаемое поведение - поскольку вы прокручиваете, вы хотели бы получить эти изображения, не так ли? Если ваша проблема заключается в том, что старые запросы все еще существуют, вам необходимо перестроить фоновый поток (вместо задач async), чтобы выполнить загрузку, и попросить пропустить запросы, если позиция не видна, когда она приближается к ее обработке , –

+1

Да, теперь я понял ясно, я думаю, что теперь есть API в listview.isRowVisible ..... есть API для видимости первой и последней строки .... так это хороший способ startDownloadingImage() { нить сон в течение 1 сек проверки, если thisRow лежит между флиртует видимой строки и последней видимой строки если да -> не начать закачку еще ничего .... Пожалуйста, предлагаю, если какой-либо лучший способ БЛАГОДАРЯ –