【问题标题】:ImageViews changed positions when scrolling in GridViewImageViews 在 GridView 中滚动时改变了位置
【发布时间】:2013-08-24 17:24:01
【问题描述】:

我有一个非常令人沮丧的问题,我不知道出了什么问题。 我构建了仅包含 GridView 的简单 XML。这个 gridview 应该显示从我用我的代码检索的特定 url 下载的图像 (ImageView)。

所以这个APP的想法只是从URLS下载图片并在GridView中显示这些图片。首先我必须说我正在使用通用图像加载器库。首先请看我的getView代码:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {

        ImageView iv;

        if(convertView == null) {

        iv = new ImageView(MyActivity.this);
        iv.setLayoutParams(new GridView.LayoutParams(size,size));
        iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
        Log.d("APP", "convertView is NULL");

        } 

        else {

        iv = (ImageView) convertView;
        Log.d("APP", "convertView is NOT null");

        }

        loader.displayImage(URLS.get(position), iv);

        return iv;

    }

问题:

上面的代码有效,它在 GridView 中显示图像。但是当我向下滚动时,我看到了:

  1. 所有图片都已下载(即使是那些不可见的图片)
  2. 当我向上滚动时,我看到位于 0 位的图像位于 1 位并且已再次下载。当我向下滚动时,图像再次切换位置。向上滚动,我再次看到图像再次切换位置(并再次下载)。这是无限的。

我是如何解决这个问题的:

  1. 我通过不检查 convertView 变量是否为空来解决了这个问题。实际上我省略了 if/else 子句。

  2. 我在内存中使用了缓存 = true。因此,下载停止和图像将永远存在。

那我为什么要寻求帮助?主要是因为我知道出于性能原因我不应该省略 if/else 子句。我不想弄乱用户的记忆,我想给他们带来快速可靠的用户体验。我也想知道有什么问题。

感谢您的帮助。非常感谢。

【问题讨论】:

    标签: java android gridview universal-image-loader


    【解决方案1】:

    加载器需要一些时间来加载ImageView 中的图片。因为您为不同的图像重复使用视图,所以在加载新图像时,您可以在视图中看到以前的图像。您可以在DisplayImageOptions 中设置resetViewBeforeLoading(true) 来避免这种影响。

    您还可以使用磁盘缓存来避免每次从网络下载图像。还限制内存缓存的大小并设置其他设置,但我认为内存缓存很有用,它改善了用户体验。 并且不要忘记使用setOnScrollListener(new PauseOnScrollListener(loader, true, true)) 以避免滚动滞后。

    【讨论】:

      【解决方案2】:

      GridView 出于性能目的回收列表项。因此,当您滚动时,列表项会在不同的地方被回收,然后您的代码会重新填充它们。有时这会滞后于图像。

      我建议使用像 Picasso 这样处理此类事情的库。

      【讨论】:

      • 感谢您的回答。但这不是很奇怪,因为我认为通用图像加载器只是为了这个目的而创建的。但我会看看你的图书馆。
      【解决方案3】:

      我遇到了和你一样的问题,也不想禁用 convertView 检查。 我的解决方案是增加 ImageLoaderConfiguration 中的内存缓存大小。

      以前,我曾经这样使用它: .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))

      所以我把它改成了: .memoryCache(new UsingFreqLimitedMemoryCache(10 * 1024 * 1024))

      我不知道 10*1024*1024 是不是太大了还是会引起什么问题,但它似乎已经解决了我的问题,直到现在我还没有遇到任何问题。

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 2012-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        相关资源
        最近更新 更多