如何根据最小和最大列宽设置 GridView 中的列数?
How to set number of columns in GridView according to minimal and maximal column width?
我的布局中有一个 GridView
,它应该占用尽可能多的 space(布局的所有其他元素具有固定大小)。
我希望 GridView
单元格中的所有 Views
占据尽可能多的宽度,即不留下任何额外的 space 除了由 GridView
.
我希望 GridView
的列数由以下约束自动确定:
- 最小列宽应为
200dp
(除非网格视图本身更小)
- 最大列宽应为
300dp
- 我总是想要满足这些约束的最大列数。
为此 android 需要自行确定正确的列数(如果单元格宽度未知,auto_fit
默认为 2)。问题是我的 ListAdapter
交付单元格 Views
和 getView()
的实现必须在网格视图的宽度已知之前交付正确大小的视图(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
但上面的解决方案是相同的结果和更少的努力。
我的布局中有一个 GridView
,它应该占用尽可能多的 space(布局的所有其他元素具有固定大小)。
我希望 GridView
单元格中的所有 Views
占据尽可能多的宽度,即不留下任何额外的 space 除了由 GridView
.
我希望 GridView
的列数由以下约束自动确定:
- 最小列宽应为
200dp
(除非网格视图本身更小) - 最大列宽应为
300dp
- 我总是想要满足这些约束的最大列数。
为此 android 需要自行确定正确的列数(如果单元格宽度未知,auto_fit
默认为 2)。问题是我的 ListAdapter
交付单元格 Views
和 getView()
的实现必须在网格视图的宽度已知之前交付正确大小的视图(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
但上面的解决方案是相同的结果和更少的努力。