1

我有一个非常令人沮丧的问题,我不知道出了什么问题。我构建了仅包含 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 子句。我不想弄乱用户的记忆,我想给他们带来快速可靠的用户体验。我也想知道什么可能是错的。

谢谢你的帮助。很受好评。

4

3 回答 3

1

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

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

于 2013-08-25T03:51:06.263 回答
0

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

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

于 2013-08-24T18:12:26.923 回答
0

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

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

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

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

于 2013-11-13T18:11:12.463 回答