动态设置网格布局的行数和列数

3

我正在动态地向 GridLayout 添加 LinearLayouts。我想要它们以网格视图的形式显示。
是否可以计算一行中可以放置多少个线性布局,并设置网格布局的列数?
我应该使用 GridView 来自动对齐它们吗?

2个回答

3
如果您想根据GridLayout的宽度计算列数,请重写onMeasure方法。它提供了widthSpecheightSpec作为参数,您可以使用MeasureSpec.getSize()来获取像素级别的实际宽度和高度。接下来,根据刚才找到的GridLayout的宽度计算要显示多少列,并使用setColumnCount将其设置为显示该列数。

1
我知道有点晚了,但事情并不像这样简单。在调用 setColumnCount(int) 之前,您还需要重新计算或使每个子视图的布局参数的行列规范无效,并调用 requestLayout()。如果不这样做,通常会导致 IllegalArgumentException。 - drdaanger

0

重写 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()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接