在GridView中滚动时,ImageViews更改了位置

时间:2013-08-24 17:24:01

标签: java android gridview universal-image-loader

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

所以这个APP的想法只是从URLS下载图像并在GridView中显示这些图像。首先,我必须说我正在使用Universal Image Loader库。首先请看我的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并且已经再次下载。当我向下滚动时,图像再次切换位置。滚动回来,我再次看到图像再次切换位置(并再次下载)。这无限。
  3. 我如何解决这个问题:

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

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

    3. 那我为什么要求帮助呢?主要是因为我知道我不应该因为性能原因而忽略if / else子句。我不想弄乱用户内存,我想为他们带来快速可靠的用户体验。我也想知道可能出现的问题。

      谢谢你的帮助。非常感兴趣。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

为了提高性能,GridView会回收列表项。所以当你滚动时,列表项会在不同的地方被回收,然后你的代码会重新填充它们。有时这会滞后于图像。

我建议使用一个处理类似Picasso的东西的库。

答案 2 :(得分:0)

我遇到了与你完全相同的问题,并且也不想禁用convertView检查。 我的解决方案是增加ImageLoaderConfiguration中的内存缓存大小。

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

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

我不知道10 * 1024 * 1024是否太多或者会造成任何问题,但它似乎已经解决了我的问题,直到现在我还没有遇到任何问题。