具有ViewHolder模式的ListView中的远程图像

主要问题:

延迟加载远程图像的最有效的无缺陷方法是在使用ViewHolder模式的简单ListView适配器中进行的吗?

我目前有一个实现,将首先检查SoftReference位图HashMap的图像的软caching版本。 如果失败,我检查我的硬caching中的图像的副本。 如果失败,我从网上获得。 我在一个单独的线程和队列中完成所有这些工作,以消除并发或重复的下载。

问题是通过callback加载。 因为我利用ViewHolder模式,我的视图不断被回收,我还没有find一个固定的方式来消除随机附加到我的ImageViews不同的图像。 我在每次加载之前默认为默认图像,但因为视图被回收得太快,所以“老”侦听器应用到我的ImageView上,提供了错误的图像,然后用正确的图像replace。

我发现的唯一的半固体解决scheme是使用ViewHolder本身作为监听器,但这只会使问题不那么明显。 它仍然发生在一个快速滚动。

任何帮助,将不胜感激。

更新:

https://github.com/DHuckaby/Prime

Solutions Collecting From Web of "具有ViewHolder模式的ListView中的远程图像"

我find了一个图像切换问题的解决scheme,我将在下面提供一个代码块。 我不会接受,因为我不知道这是否是最有效的方法,这是我原来的问题。 如果这是正确实施,它将完美的工作。

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); } } }