【问题标题】:Updating List View after Async Task finishes Android异步任务完成后更新列表视图 Android
【发布时间】:2015-09-04 09:55:02
【问题描述】:

我有一个图像列表视图。

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

然后运行一个异步任务从服务器下载图像。

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

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

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

有什么问题?

【问题讨论】:

  • 我建议您使用 volley 或 Picasso 库来加载图像。
  • 需要进行如下操作 //清除现有项 listAdapter.clear(); //添加新项 listAdapter.addAll(updatedvalues); //通知数据发生变化 listAdapter.notifyDataSetChanged();

标签: android image asynchronous android-listview


【解决方案1】:

我相信您正在做的事情已经完成并且运行良好。

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

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

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

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

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

【讨论】:

  • 我喜欢这个图书馆……以前从未听说过。我有一个名为setRoundedCorners(bitmap, left, right, top, bottom) 的方法。我通常会在这里运行位图。我如何将这种方法与毕加索一起使用?
  • 你可以用毕加索的transform apipicasso看看=)
【解决方案2】:

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

我在一个非常相似的场景中工作过,我有一个单独的设计,比如 Adapter -> ImageViewRequest(这个类将用于发布请求,并且这个类维护一个 ImageView 和 URL 的映射。所以对于每个请求条目都是对地图完成,并且对于每个响应,我们检查 URL 的响应是否是该 ImageView 条目的当前请求 URL,然后进行相应设置)-> AsyncTask 并确保在设置位图时在 runOnUIThread 任务中执行此操作,以确保正确加载图像,否则您可能会出现崩溃,说明您在错误的线程中设置。

希望有帮助:)

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多