根据宽度放置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) }
我如何定位孩子? 有更好的回调使用?