我正在动态地向 GridLayout
添加 LinearLayouts
。我想要它们以网格视图的形式显示。
是否可以计算一行中可以放置多少个线性布局,并设置网格布局的列数?
我应该使用 GridView
来自动对齐它们吗?
我正在动态地向 GridLayout
添加 LinearLayouts
。我想要它们以网格视图的形式显示。
是否可以计算一行中可以放置多少个线性布局,并设置网格布局的列数?
我应该使用 GridView
来自动对齐它们吗?
GridLayout
的宽度计算列数,请重写onMeasure
方法。它提供了widthSpec
和heightSpec
作为参数,您可以使用MeasureSpec.getSize()来获取像素级别的实际宽度和高度。接下来,根据刚才找到的GridLayout
的宽度计算要显示多少列,并使用setColumnCount
将其设置为显示该列数。重写 GridLayout 的 onMeasure
方法。示例(使用 Kotlin 编写,但应该很容易转换为 Java):
override fun onMeasure(widthSpec: Int, heightSpec: Int) {
var childWidth = 0
for (i in 0 until childCount) {
val c = getChildAt(i)
if (c.visibility == View.GONE) {
continue
}
val params = c.layoutParams
if (params.width>childWidth) childWidth = params.width
}
val width = MeasureSpec.getSize(widthSpec)
columnCount=width/childWidth
super.onMeasure(widthSpec, heightSpec)
}
尽管@drdaanger在他的回复中提到了,但我不需要requestLayout()
。
setColumnCount(int)
之前,您还需要重新计算或使每个子视图的布局参数的行列规范无效,并调用requestLayout()
。如果不这样做,通常会导致 IllegalArgumentException。 - drdaanger