Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何根据最小和最大列宽设置GridView中的列数?_Android_Android Layout_Android Gridview - Fatal编程技术网

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
  • 我始终希望符合这些约束的列数达到最大值
为此,android需要自行确定正确的列数(
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()
    等待网格视图确定其大小,而不是自己计算列数,然后设置
    适配器
    ,但是上面的解决方案在结果上是相同的,而且工作量要小得多