Android中GridView滚动问题

25

我在我的简单GridView中遇到了奇怪的滚动问题。网格中的每个项目只是一个ImageView和一个TextView。该活动本质上只是一个应用程序选择器。它看起来像Android中基本App Tray的粗略版本。

问题在于,在浏览视图时,经过一段时间后,它将不可避免地允许我继续向上滚动到一个空白屏幕,并且滚动条将消失,让我卡住。

这并不是每次我到达视图顶部时都会发生,只有有时候,通常只是在进行了一些过度滚动之后。

如果我碰巧注意到问题并在顶行消失在屏幕底部之前抓住它,我通常可以通过浏览视图并发现一些缺少的图标来向后滚动。网格中有空白空间,我只能假设那些图标已被移动到某个奇怪的位置,这使得视图可以向上滚动。

这是我第一个除了基本的Hello World之外的Android应用程序,因此很可能我在我的布局文件中搞砸了一些东西。我也意识到这可能是一个相当令人困惑的描述,所以我希望有人经历过这种情况,而我的搜索能力只是找不到它。

如果有人认为这有用,我可以发布我的布局文件或其他代码。

哦,这个程序是针对1.5构建的,但在我的手机上运行的是2.2(上周溜出来的状态)。我没有足够的应用程序在模拟器上测试这个问题,但如果有人觉得有必要,我可能可以设置一些东西。

提前感谢任何关于此问题的帮助。


请发布以下程序相关内容的代码: 1) 您的activity/list/item布局和2)您的适配器代码。 - Joseph Earl
你能解决这个问题吗?我遇到了这个问题。 - pengwang
5个回答

10

我遇到了同样的问题,但我只在GridView中发布了ImageView,所以pengwang的答案对我没有帮助。 我找到了这个错误的解释:https://code.google.com/p/android/issues/detail?id=16218

问题在于GridView目前无法处理高度不同的项。

我的解决方案是使用确切指定的相同layout_height来处理所有GridView的项目。


谢谢这一个。奇怪的症状。 - Kevin Mark
谢谢,这帮助我解决了类似的问题。首先,我从getView(final int position, View convertView, ViewGroup parent)中以编程方式添加了一些TextViewButton。然后我使用getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {...}来获取每行的最大高度。最后,我使用最后一列位置来设置每个子项的高度,使用viewGroup.getChildAt(position)在每行中移动View - ArtiomLK

5

1

看起来如果你快速地从 GridView 的底部往回滚动几次,最终你会注意到视图中的元素向左移了一个位置。当这种情况发生时,你可以将 GridView 滚动到顶部,但在列表顶部时,第 0 项不会显示,它被第 1 项代替,并且在该行上方只有黑色。

在此情况下单击任何项都会重置列表,一切又恢复正常了。

这肯定是个 bug。它非常容易重现,而且我认为我所做的任何事情都没有导致混乱。此时,向列表适配器添加内容已停止。

目前我正在使用 Android 2.3.3。


此时,向列表适配器添加已停止。你能给我更多细节吗?我遇到了这个问题:http://stackoverflow.com/questions/5944250/gridview-cannot-show-image - pengwang

0

我刚遇到了同样的问题 - 我有一个具有不同高度的图像网格。在阅读了Android开发者文档中关于GridView、GridView.LayoutParams和GridLayout的内容后,我做了两件事来解决我的问题:

  1. 找到每一行中最高的图像,并将其高度存储在一个行 -> 行高的映射中。每个我下载的图像都有宽度和高度信息,所以我可以通过重写适配器的addAll(items)方法轻松地完成这个操作。

  2. 在getView()中,我创建了一个GridView.LayoutParams(MATCH_PARENT, getRowHeight(position)),它将每个网格项设置为其特定行的最大行高。

  3. 将我的ImageView包装在一个LinearLayout中。我尝试过其他布局,但LinearLayout是唯一有效的。为图像视图设置android:scaleType="fitCenter"和android:adjustViewBounds="true"。

经过以上3个步骤,我终于让网格看起来正确了,它们具有不同的高度,并且没有滚动问题。


0

我有一个类似但可能不太常见的问题,就是只要稍微滚动一点点就会将gridview滚动到底部,而我无法向上滚动。这种情况仅在gridview较小时出现,例如键盘可见时。问题出在我使用了:

    android:paddingBottom="400dp"
    android:clipToPadding="false"

通过减小底部填充的大小,解决了我的问题。希望这能帮助至少一个人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接