Android 如何根据最小和最大列宽设置GridView中的列数?
我的布局中有一个Android 如何根据最小和最大列宽设置GridView中的列数?,android,android-layout,android-gridview,Android,Android Layout,Android Gridview,我的布局中有一个GridView,它应该占据尽可能多的可用空间(布局的所有其他元素都有固定大小) 我希望网格视图单元格中的所有视图占据尽可能多的宽度,即除了网格视图定义的间距外,不留任何额外空间 我希望通过以下约束自动确定GridView的列数: 最小列宽应为200dp(除非网格视图本身较小) 最大列宽应为300dp 我始终希望符合这些约束的列数达到最大值 为此,android需要自行确定正确的列数(auto_-fit如果单元格宽度未知,则默认为2)。问题是,使用getView()传递单元格
GridView
,它应该占据尽可能多的可用空间(布局的所有其他元素都有固定大小)
我希望网格视图
单元格中的所有视图
占据尽可能多的宽度,即除了网格视图
定义的间距外,不留任何额外空间
我希望通过以下约束自动确定GridView
的列数:
- 最小列宽应为
(除非网格视图本身较小)200dp
- 最大列宽应为
300dp
- 我始终希望符合这些约束的列数达到最大值
auto_-fit
如果单元格宽度未知,则默认为2)。问题是,使用getView()
传递单元格视图的ListAdapter
实现必须在网格视图的宽度已知之前传递正确大小的视图(parent.getWidth()
最初将返回0)
因此,在布局阶段,网格视图的宽度还不知道,但网格视图仍然希望知道列的数量。但是,为了根据约束条件确定列数,我必须知道网格视图的宽度(因为它占用了所有可用空间,所以应该可以知道)
还可以在视图上设置最小宽度和高度,但这似乎对网格视图的列宽没有帮助
那么,我如何以编程方式实施所有这些约束呢?最后,这比我一开始想象的要容易得多
如果您:
- 在网格视图的布局中设置android:numColumns=“auto_-fit”android:stretchMode=“columnWidth”
,并
在用于网格视图单元格的视图布局中设置android:minWidth=“200dp”
,并
在两种模式中设置android:layout\u width=“match\u parent”android:layout\u height=“match\u parent”
这意味着每列必须至少为200 dp,android将确定列数,以便设置列宽至少为200 dp的最大列数,如果列更宽,则将拉伸单元格(均匀)
我有更复杂的解决方案,包括getViewTreeObserver()。addOnGlobalLayoutListener()
等待网格视图确定其大小,而不是自己计算列数,然后设置适配器
,但是上面的解决方案在结果上是相同的,而且工作量要小得多