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

时间:2015-11-25 09:05:14

标签: android android-layout android-gridview

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

我希望Views单元格中的所有GridView占用尽可能宽的宽度,即除GridView定义的间距外不留任何额外空间。< / p>

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

  • 最小列宽应为200dp(除非网格视图本身较小)
  • 最大列宽应为300dp
  • 我总是希望符合这些约束条件的列数最多。

对于这个android需要以某种方式单独确定正确的列数(如果单元格宽度未知,则auto_fit默认为2)。问题是,我ListAdapter传递带有Views的单元格getView()的实施必须在网格视图的宽度已知之前提供正确大小的视图(parent.getWidth()将返回0最初)。

因此,在布局阶段,网格视图的宽度尚不清楚,但网格视图仍然想知道列数。为了根据我的约束确定列数,我必须知道网格视图的宽度(因为它占用了所有可用空间,无论如何这应该是可以知道的。)

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

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

1 个答案:

答案 0 :(得分:0)

最后,它比我在开始时想象的容易得多。

如果您:

,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但是上面的解决方案是结果相同,费用也少得多。