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

Java 在GridView中滚动时,ImageView更改了位置,java,android,gridview,universal-image-loader,Java,Android,Gridview,Universal Image Loader,我有一个非常令人沮丧的问题,我不知道哪里出了问题。 我构建了只包含GridView的简单XML。这个gridview应该显示从我用代码检索的特定URL下载的图像(ImageView) 因此,这个应用程序的想法只是从URL下载图像,并在GridView中显示这些图像。首先,我必须说我使用的是通用图像加载器库。首先请查看我的getView代码: @Override public View getView(int position, View convertView, ViewGrou

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

因此,这个应用程序的想法只是从URL下载图像,并在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中显示图像。但当我向下滚动时,我看到:

  • 已下载所有图像(即使是不可见的图像)
  • 当我向上滚动时,我看到位于0位置的图像,位于1位置,并且已再次下载。当我向下滚动时,图像再次切换位置。滚动回来,我再次看到图像正在切换位置(并再次下载)。这是无限的
  • 我是如何解决这个问题的:

  • 我通过不检查convertView变量是否为null解决了这个问题。实际上我建议使用if/else子句

  • 我使用了cache in memory=true。因此,下载站点和图像将永远到位

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


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

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


    我建议使用处理这类事情的库。

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


    我建议使用一个库来处理这类事情。

    Loader需要一些时间才能在
    ImageView
    中加载Picture。因为对不同的图像重用视图,所以在加载新图像时,可以在视图中看到以前的图像。您可以在
    DisplayImageOptions
    中设置
    resetViewBeforeLoading(true)
    ,以避免这种效果

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

    loader需要一些时间才能在
    图像视图中加载图片。因为对不同的图像重用视图,所以在加载新图像时,可以在视图中看到以前的图像。您可以在
    DisplayImageOptions
    中设置
    resetViewBeforeLoading(true)
    ,以避免这种效果

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

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

    以前,我经常这样使用它:
    .memoryCache(新的使用FreqLimitedMemoryCache(2*1024*1024))

    所以我把它改成:
    .memoryCache(新的使用FreqLimitedMemoryCache(10*1024*1024))


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

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

    以前,我经常这样使用它:
    .memoryCache(新的使用FreqLimitedMemoryCache(2*1024*1024))

    所以我把它改成:
    .memoryCache(新的使用FreqLimitedMemoryCache(10*1024*1024))


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

    谢谢您的回答。但这不是很奇怪吗,因为我认为universal image loader就是为了这个目的而创建的。但我会看看你们的图书馆。谢谢你们的回答。但这不是很奇怪吗,因为我认为universal image loader就是为了这个目的而创建的。但我会看看你的图书馆。