columnCount必须大于或等于每个子项的LayoutParams中定义的所有网格索引(和跨度)的最大值

时间:2016-08-06 15:12:09

标签: android android-gridlayout

我在做什么:尝试使用GridLayout setColumnCount()中的onGlobalLayout()更改OnGlobalLayoutListener()的列数

我想要实现的目标:在确定屏幕尺寸是多少之后,我想更改GridLayout列数留给它的子元素,即如果屏幕大小只能容纳5个GridLayout's子元素,那么我将列数设置为5,这样在第5个元素之后第6个元素将被放置在第2行,依此类推。 br />
我如何努力实现这一目标:首先,我使用GridLayout获得ViewTreeObserver的总宽度。然后将其除以单个子元素的大小,然后将其设置为setColumnCount()值。

代码:

ViewTreeObserver vto = gridLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        gridLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int gridLayoutWidth = Utils.pxToDp(mContext,gridLayout.getWidth()); //GridLayout width in DP
        int childElementWidth = 44; //Child element width in DP
        int columnCount = (gridLayoutWidth/childElementWidth);
        gridLayout.setColumnCount(columnCount);
    }
});


我坚持的是什么: columnCount must be greater than or equal to the maximum of all grid indices (and spans) defined in the LayoutParams of each child

1 个答案:

答案 0 :(得分:0)

在使用减少的列数或行数进行更新之前,需要在GridLayout的新范围内设置子视图的列或行规范。

我在Kotlin中创建了一个函数,以指定的列数和布局中固定数量的子视图为我实现此功能。很抱歉没有用Java编写它,但这没什么不同。

fun setGridColumns(gridLayout: GridLayout, columns: Int) {
    var col = 0
    var row = 0
    for (child in gridLayout.children) {
        val params = child.layoutParams as GridLayout.LayoutParams
        params.columnSpec = GridLayout.spec(col, 1, 1f)
        params.rowSpec = GridLayout.spec(row, 1, 1f)
        if (col + 1 == columns) {
            col = 0
            row++
        } else {
            col++
        }
    }
    gridLayout.requestLayout() // Forces maxIndex to be recalculated when columnCount is set
    gridLayout.columnCount = columns
}