主要问题:
在使用ViewHolder模式的简单ListView适配器中,延迟加载远程图像的最有效的无错方法是什么?
我目前有一个实现,它将首先检查SoftReference Bitmap HashMap以获得图像的软缓存版本。如果失败,我检查我的硬缓存是否有图像副本。如果失败了,我会从网上获得。我在一个单独的线程和队列中完成所有这些操作,以消除并发或重复下载。
问题在于通过回调加载。因为我使用ViewHolder模式,我的视图不断被回收,我还没有找到一种可靠的方法来消除随机附加到我的ImageViews的不同图像。我在每次加载之前默认使用默认图像,但因为视图正在被回收,所以“旧”侦听器应用到我的ImageView上,提供错误的图像,然后用正确的图像替换。
我发现的唯一半固体解决方案是使用ViewHolder本身作为监听器,但这只会使问题不那么明显。它仍然发生在快速滚动上。
任何帮助都将不胜感激。
更新
答案 0 :(得分:6)
我找到了图像切换问题的解决方案,我将在下面提供一个代码块。我不会接受它,因为我不知道这是否是最有效的方法,这是我原来的问题。如果这是正确实现的,它将完美地运作。
public void getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
...
String imagePath = insertImageUrlHere();
Object tag = holder.userThumb.getTag();
if (tag != null && tag.equals(imagePath)) {
// Do nothing
} else {
holder.userThumb.setTag(imagePath);
holder.userThumb.setImageResource(R.drawable.default_image);
AsynchronousImageLoadingUtility.load(imagePath, holder);
}
...
return convertView;
}
private static class ViewHolder implements AsynchronousImageLoadingUtilityCallback {
private ImageView userThumb;
@Override
public void onImageLoad(String source, Bitmap image) {
if (image != null && userThumb.getTag().equals(source)) {
userThumb.setImageBitmap(image);
}
}
}