如何根据最小和最大列宽设置 GridView 中的列数?

How to set number of columns in GridView according to minimal and maximal column width?

我的布局中有一个 GridView,它应该占用尽可能多的 space(布局的所有其他元素具有固定大小)。

我希望 GridView 单元格中的所有 Views 占据尽可能多的宽度,即不留下任何额外的 space 除了由 GridView.

我希望 GridView 的列数由以下约束自动确定:

为此 android 需要自行确定正确的列数(如果单元格宽度未知,auto_fit 默认为 2)。问题是我的 ListAdapter 交付单元格 ViewsgetView() 的实现必须在网格视图的宽度已知之前交付正确大小的视图(parent.getWidth() 将 return 最初为 0).

所以在布局阶段网格视图的宽度是未知的,但网格视图仍然想知道列数。然而,为了根据我的约束确定列数,我必须知道网格视图的宽度(并且因为它占用了所有可用的 space 无论如何这应该是可能知道的)。

也可以在 Views 上设置最小宽度和高度,但这似乎对网格视图的列宽没有帮助。

那么如何以编程方式强制执行所有这些约束?

最后比我一开始想的要容易得多。

Android 或多或少会自动为您完成,如果您:

  • 在网格视图的布局中设置android:numColumns="auto_fit" android:stretchMode="columnWidth"并且
  • 在用于网格视图单元格的视图布局中设置android:minWidth="200dp"并且
  • 同时设置android:layout_width="match_parent" android:layout_height="match_parent"

这意味着每列必须至少为 200 dp,android 将确定列数,以便设置列宽至少为 200 dp 的最大列数,如果列更宽它会拉伸单元格(均匀)。

我有更复杂的解决方案涉及 getViewTreeObserver().addOnGlobalLayoutListener() 等到网格视图确定它的大小而不是自己计算列数然后设置 Adapter 但上面的解决方案是相同的结果和更少的努力。