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

时间:2011-10-05 20:09:20

标签: android listview android-listview

主要问题:

在使用ViewHolder模式的简单ListView适配器中,延迟加载远程图像的最有效的无错方法是什么?

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

问题在于通过回调加载。因为我使用ViewHolder模式,我的视图不断被回收,我还没有找到一种可靠的方法来消除随机附加到我的ImageViews的不同图像。我在每次加载之前默认使用默认图像,但因为视图正在被回收,所以“旧”侦听器应用到我的ImageView上,提供错误的图像,然后用正确的图像替换。

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

任何帮助都将不胜感激。

更新

https://github.com/DHuckaby/Prime

1 个答案:

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