根据宽度放置GridLayout的子项

我有一个GridLayout,他们的孩子有相同的固定大小。 我想让孩子们适应可用的宽度:

在一个例子中:

|| | @1 @2 @3 @4 | | @5 | 

在另一个:

 | @1 @2 | | @3 @4 | | @5 | 

auto_fit像一个GridView与auto_fit启用。 (但我不能使用GridView的原因,请不要建议。)

为此,我想知道可用宽度后,计算列的数量并设置每个子的LayoutParams(即行列索引)。

现在,在父片段的onCreateView中,GridLayout的宽度还不可用。 所以我设置了numColumns ,添加孩子,让他们自动定位,然后我想重新定位孩子。 我发现的最合理的地方是在布局更改侦听器( gridLayout.addOnLayoutChangeListener )中执行此操作,因为此时GridLayout的宽度是可用的。 但是,当我改变孩子的布局参数,然后调用gridLayout.requestLayout (1)时,没有任何反应(即孩子仍然具有onCreateView之后的相同位置)。 我也试图在每个子setLayoutParams (2)上调用setLayoutParams ,但是会产生requestLayout从布局监听器被错误地调用的警告,而且这些子requestLayout仍然没有被重新定位。

这里的代码(在Kotlin,但我希望很可读):

  gridLayout.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom -> val width = v.width val childWidth = CHILD_WIDTH val nColumns = width / childWidth for (index in 0 until gridLayout.childCount) { val child = gridLayout.getChildAt(index) val layoutParams = child.layoutParams as GridLayout.LayoutParams layoutParams.rowSpec = GridLayout.spec(index / nColumns) layoutParams.columnSpec = GridLayout.spec(index % nColumns) // child.layoutParams = layoutParams // (2) } gridLayout.requestLayout() // (1) } 

我如何定位孩子? 有更好的回调使用?