2015-09-04 3 views
0

У меня есть вид списка изображений.Обновление списка просмотра после завершения задачи Async Android

Если в локальном кеше не существует изображения, то вместо него изображение-заполнитель останется на месте.

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

После завершения задачи async я установил растровое изображение imageView в загруженное изображение. Затем я звоню notifyDataSetChanged()

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

Так у меня есть:

public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> { 

    private ImageView imageView; 

    public ImageLoadTask(ImageView imageView) { 
     this.imageView = imageView; 
    } 

    @Override 
    protected Bitmap doInBackground(Void... params) { 

     // download image from server and return  
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     super.onPostExecute(result); 
     imageView.setImageBitmap(result) 
     notifyDataSetChanged() 
    } 
} 

и в моем методе GetView() у меня есть:

if(image exists in cache){ 
    myImageView.setBitmap(image in Cache); 
}else{ 
    new ImageLoadTask(myImageView).execute() 
} 

Так любые изображения, которые были сохранены в кэше, работают нормально.

Любые изображения, которые должны быть загружены сначала, не будут корректно обновляться, если вы не прокрутите вниз и не вернетесь снова.

В чем проблема?

+0

Я предлагаю вам использовать библиотеку volley или Picasso для загрузки изображений. –

+0

вам нужно сделать следующие // Очищаем существующие элементы 'listAdapter.clear();' // Добавление новых элементов 'listAdapter.addAll (updatedvalues);' // Уведомить о том, что данные изменились ' listAdapter.notifyDataSetChanged(); ' –

ответ

0

Я считаю, что вы делаете теги, которые уже сделаны, и работают нормально.

Советуем вам использовать библиотеку для загрузки изображений с помощью listview. Одним из них является библиотека picasso Picasso Android. Эта библиотека предоставляет загрузку и кеширование и может легко (с одной строкой) отображать их в режиме просмотра изображений. Также он предоставляет возможность для создания образа места.

Picasso.with(context) 
    .load(url) 
    .resize(50, 50) 
    .centerCrop() 
    .into(imageView) 

Вот еще один вопрос о stackoveflow: Using Picasso library with ListView

EDIT: Если вы используете Picasso вы также решить проблему с изображениями неправильно отображать при прокрутке. Это происходит, если вы загружаете/загружаете их в AsyncTask, и вы не делаете это правильно.

Я отвечал на вопрос об этой проблеме несколько daays назад: Why are wrong images getting loaded in ListView occasionally?

+0

Мне нравится эта библиотека ... никогда не слышал об этом раньше. У меня есть метод, называемый setRoundedCorners (bitmap, left, right, top, bottom). И я обычно запускаю растровое изображение. Как использовать этот метод с пикассо? –

+0

Вы можете использовать преобразование api picasso [picasso] (http://square.github.io/picasso/) посмотреть =) –

0

Во-первых, если вы используете объект ImageView непосредственно, то вам не нужно вызывать notifyDataSetChanged. Во-вторых, вам нужно убедиться, что объект ImageView, который вы передаете, по-прежнему существует для того же запрошенного URL-адреса, то есть, поскольку вы должны знать, что Android будет повторно использовать представления и может быть, если между вами прокручивается объект ImageView для который вы запросили для URL-адреса, изменился бы на другой URL-адрес.

Я работал над очень похожим сценарием, где у меня был отдельный дизайн, такой как Adapter -> ImageViewRequest (этот класс будет использоваться для отправки запроса, и этот класс поддерживает карту ImageView и URL.Таким образом, для каждой записи запроса выполняется карта, и для каждого ответа мы проверяем, что ответ для URL-адреса является текущим запрошенным URL-адресом для входа этого ImageView, а затем соответствующим образом задан) -> AsyncTask И также убедитесь, что при настройке bitmap, вы делаете это внутри задачи runOnUIThread, чтобы убедиться, что изображение правильно загружено, иначе вы можете получить сообщение об ошибке, указывающее, что вы устанавливаете неправильный поток.

Надеюсь, что это поможет :)

Смежные вопросы