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)
在ListView中延迟加载图像时会出现两个问题.
第二个问题难以解决.想象一下,你在列表中滚动非常快.现在,在旧的AsyncTask加载图像之前,您的视图可以被回收.您现在有两个正在运行的任务,在onPostExecute方法中将图像设置为imageview.现在短时间内将显示错误的图像,直到第二个任务完成,或者更糟糕的是由于某些网络相关的原因,它们没有按照它们开始的顺序完成,并且您有错误的图像覆盖了正确的图像.要解决此问题,您必须检查任务完成后应显示的图像.在View类中,有两种方法可以完全像这样:
setTag并且getTag您可以将任何对象绑定到您脑海中的imageview.在大多数情况下,在开始任务之前,我使用setTag将图像的URL作为String绑定到imageview.现在,我可以在任务完成后将getTag强制转换为String,并将应显示的URL与我下载的URL进行比较,并在必要时仅设置图像.
void setBitmap(Bitmap bitmap, int position)在适配器中创建一个名为 或类似的函数。当新位图可用时,让您的 AsyncTask 调用此方法。然后,此方法可能会调用notifyDataSetChanged()UI 线程本身以确保刷新视图。在适配器中保存对视图的引用(即使将它们保存在 AsyncTask 中)是危险的!
| 归档时间: |
|
| 查看次数: |
6172 次 |
| 最近记录: |