我在做什么:尝试使用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
答案 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
}