异步任务完成Android后更新列表视图

时间:2015-09-04 09:55:03

标签: android image asynchronous android-listview

我有一个图像列表视图。

如果本地缓存中不存在图像,则占位符图像将保留在图像的位置。

然后运行异步任务从服务器下载映像。

异步任务完成后,我将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()
}

因此,存储在缓存中的任何图像都可以正常工作。

除非您向下滚动并再次备份,否则任何必须先下载的图像都无法正确更新。

有什么问题?

2 个答案:

答案 0 :(得分:0)

我相信你正在做已经完成的事情并且工作正常。

我建议您使用库来加载带有listview的图像。其中一个是毕加索Picasso Android库。该库提供下载和缓存,并且可以轻松(使用一行)将它们显示到imageview。它还为占位符图像提供了可能性。

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

这是关于stackoveflow的另一个问题: Using Picasso library with ListView

修改 如果您使用picasso ,您还可以解决滚动时图像显示错误的问题。如果您在AsyncTask中加载/下载它们并且您没有正确执行此操作,则会发生这种情况。

我几天前回答了关于这个问题的问题:Why are wrong images getting loaded in ListView occasionally?

答案 1 :(得分:0)

首先,如果直接使用ImageView对象,则不需要调用notifyDataSetChanged。 其次,您需要确保的是,您传递的ImageView对象仍然存在于请求的相同URL,即,您必须知道Android将重新使用视图,并且可能是在您之间滚动了ImageView对象的您曾要求将URL更改为其他URL。

我参与了一个非常类似的场景,我有一个像Adapter这样的独立设计 - &gt; ImageViewRequest(此类将用于发布请求,此类维护ImageView和URL的映射。因此,对于每个请求条目都对映射完成,并且对于每个响应,我们检查URL的响应是当前请求的URL用于输入该ImageView然后相应地设置) - &gt;的AsyncTask 并且还要确保在设置位图时在runOnUIThread任务中执行此操作以确保正确加载图像,否则可能会发生崩溃,说您正在设置错误的线程。

希望有所帮助:)