【问题标题】:Remote Images in a ListView with ViewHolder pattern具有 ViewHolder 模式的 ListView 中的远程图像
【发布时间】:2011-10-05 20:09:19
【问题描述】:

主要问题:

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

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

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

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

任何帮助将不胜感激。

更新:

https://github.com/DHuckaby/Prime

【问题讨论】:

  • 这对我来说也很烦人,有时会迫使我不使用回收机制(性能以换取更好的用户体验,即看不到交换图像)。如果您解决了这个问题,如果您发布自己的答案,将不胜感激,您将从我这里得到 +1 :) 如果我发现任何东西,我也会发布一些东西
  • 我看到了同样的 sh*tty 行为。 Android 的另一个领域,系统本身没有帮助,而是迫使每个用户从头开始重新实施解决方案。大多数在迭代 1-5 时失败。是的,我有点像 Android 粉丝

标签: android listview android-listview


【解决方案1】:

我已经找到了图像切换问题的解决方案,我将在下面提供一个代码块。不过,我不会接受它,因为我不知道这是否是最有效的方法,这是我最初的问题。如果正确实施,它将完美运行。

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

【讨论】:

  • 是的。自从发表这篇文章以来,我已经将这种模式构建成一个更好的实用程序:github.com/DHuckaby/Prime
  • @HandlerExploit 你能把你的代码粘贴到这里吗,因为上面的代码没有完成if (convertView == null)
  • 很好的解决方案,我也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多