在Android上的ListView中加载延迟图像

shi*_*ami 6 android lazy-loading android-listview

我实现了懒人加载图像ListView.我使用a AsyncTask从Internet下载图像并将其绑定到UIThread中的ImageView.

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

我想这个问题是从重用convertView的BaseAdapter.有什么想法可以解决吗?

非常感谢.

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*usz 7

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

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

    setTag并且getTag您可以将任何对象绑定到您脑海中的imageview.在大多数情况下,在开始任务之前,我使用setTag将图像的URL作为String绑定到imageview.现在,我可以在任务完成后将getTag强制转换为String,并将应显示的URL与我下载的URL进行比较,并在必要时仅设置图像.


mre*_*elt 2

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

  • 当然,如果视图暂时不可见,http://stackoverflow.com/questions/3724874/android-update-single-item-in-list 上的解决方案可能会返回 null - 所以你必须检查这一点。我已经在那里添加了对此的评论。 (3认同)