当前位置: 首页 > 知识库问答 >
问题:

图像视图在网格视图中滚动时更改了位置

羊昊苍
2023-03-14

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

因此,此应用程序的想法只是从URL下载图像并在网格视图中显示这些图像。首先,我必须说我正在使用通用图像加载器库。首先,请看一下我的获取视图代码

@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位置,并且已再次下载。当我向下滚动时,图像再次切换位置。向上滚动,我再次看到图像再次切换位置(并再次下载)。这是无限的

我如何解决这个问题:

> < li>

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

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

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

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

共有3个答案

令狐跃
2023-03-14

我遇到了与您完全相同的问题,也不想禁用转换视图检查。我的解决方案是在映像加载程序中增加内存缓存大小。

以前,我经常这样使用:<code>。memoryCache(新使用FreqLimitedMemorycache(2*1024*1024))

所以我把它改为:<code>。memoryCache(新的使用FreqLimitedMemorycache(10*1024*1024))

我不知道10*1024*1024是不是太多了还是会出什么问题,但是它好像已经把问题修复给我了,到现在都没出什么问题。

韦阳晖
2023-03-14

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

我建议使用一个像毕加索这样处理这类事情的图书馆。

苏宏逸
2023-03-14

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

此外,您可以使用磁盘缓存来避免每次从网络下载图像。也限制内存缓存的大小和设置其他设置,但我认为内存缓存是有用的,它改善了用户体验。不要忘记使用<code>setOnScrollListener(新的PauseOnScrollListener(loader,true,true))

 类似资料:
  • 基本上,我有一个方法可以将Image从数据库加载到ImageView中,还有第二个方法可以更改图像,我成功地运行了这两个方法,没有出现异常,但是在change eImage()方法中的setImage之后,我需要更新什么以及如何(场景、阶段)是可能的。我知道在javafx中没有像swings中的repaint()这样的方法,那么我该如何处理呢?

  • 我正在设计一个具有滚动视图的页面,其上方是表格视图(禁用滚动)。为此,我在这个问题中提到了答案 - 使UITableView不可滚动并调整高度以容纳所有单元格,但没有成功。 视图层次结构以及提供的约束- -主视图 -滚动视图< br >固定在主视图的所有边上(0,0,0,0),限制边距 -内容视图 固定到滚动视图(0,0,0,0),与主视图宽度相等,与主视图高度相等(优先级-250) -内容视图中

  • 我的TableView包含一些数字数据。当我说按按钮编辑值时,它会将单元格的背景更改为绿色。当没有足够的行使表格可滚动时,这种方法很有效。一旦表格变成(或从一开始就是)可滚动的,它就会开始表现出怪异的行为。它会更改已编辑项目的背景,但也会更改在向下滚动之前不可见的项目的背景。然而,当我调试时,更改背景的代码只被调用一次。我认为它与tableview有关,当is scrollable破坏并重新创建单

  • 在应用程序启动时,我试图使用以下代码通过查看加载更改单独视图的位置: 但是,这似乎无法直接在viewDidLoad中工作。如果我使用iAction将to指定给按钮,代码就会工作 我猜我这里遗漏了什么,但我不知道是什么。

  • 我有一个当用户滚动时显示隐藏单元格的tableView。不确定为什么会出现这种情况。 在视图中DidLoad() 用户点击按钮后,表格将以可设置动画的方式展开。 在 func tableView(_ tableView: UITableView, cellForRowAt 索引路径: 索引路径) - 当我滚动时,所有单元格都被隐藏。我看到它们是在单元格中创建的,但是,它们不会出现在我的屏幕上。为什

  • 利用UIScrollView实现视差滚动效果。在demo中,滑动ScrollView,背景图和文字的滚动速度不一样。直接用ScrollView 的协议,对其子视图的坐标进行随机系数比例的位置移动修正,从而实现视差滚动效果。没有用其他的框架,代码简单。 作者说:原创Demo 转载请注明出处。 [Code4App.com]