6

我在我的ListView. 我使用 aAsyncTask从互联网下载图像并将其绑定到 UIThread 中的 ImageView。

它的工作原理是当我ListView快速滚动变化时,下载的图像有时会绑定到列表中的错误项目中。

我猜问题出convertViewBaseAdapter. 有什么想法可以解决吗?

非常感谢。

编辑:我将答案发布如下:

public void setBitmap(int position, Bitmap image) {
    View itemView = mListView.getChildAt(position - mListView.getFirstVisiblePosition());
    if (itemView != null) {
        ImageView itemImageView = (ImageView) itemView.findViewById(R.id.item_imageview);
        itemImageView.setImageBitmap(image);
    }
}
4

2 回答 2

7

在 ListView 中延迟加载图像时会出现两个问题。

  1. 在加载新图像之前,仍会显示旧图像。这很容易,只需将 ImageView 设置为图像正在加载视图或在开始图像下载之前将其设置为不可见。
  2. 第二个问题更难解决。想象一下,您正在快速浏览您的列表。现在,您的视图可能会在旧的 AsyncTask 完成加载图像之前被回收。您现在在 onPostExecute 方法中运行了两个任务,它们会将图像设置为图像视图。现在会在短时间内显示错误的图像,直到第二个任务完成,或者由于某些与网络相关的原因,它们没有按照开始的顺序完成,并且您有错误的图像覆盖了正确的图像,所以更糟糕的是。要解决这个问题,您必须检查任务完成后应该显示什么图像。在View类中,有两种方法可以用于与此完全相同的事情:

    setTag并且getTag您可以将任何对象绑定到您想到的图像视图。在大多数情况下,我在开始任务之前使用 setTag 将图像的 URL 作为字符串绑定到图像视图。现在我可以在任务完成后将 getTag 转换为字符串,并将应该显示的 URL 与我下载的 URL 进行比较,并仅在必要时设置图像。

于 2010-09-22T07:33:36.053 回答
2

void setBitmap(Bitmap bitmap, int position)在您的适配器中创建一个名为或类似的函数。当有新的位图可用时,让您的 AsyncTask 调用此方法。然后,此方法可能会调用notifyDataSetChanged()UI-Thread 本身以确保刷新视图。在适配器中保存对视图的引用(即使将它们保存在 AsyncTask 中)是危险的!

于 2010-09-22T07:14:24.293 回答