我可以在 GridLayoutManager 中以百分比设置列宽吗?

Can I set the width of a column in percents in GridLayoutManager?

我有一个包含 RecyclerView 的警告对话框。回收器中的每个项目都是一个简单的复选框。我需要把它画成三列。

为此我使用 GridLayoutManager

layoutManager = GridLayoutManager(context, 3, GridLayoutManager.HORIZONTAL, false)

我看到的结果是这样的

不错。问题是我需要将每列的宽度设置为对话框宽度的 33%。我的复选框没有任何固定宽度(以像素为单位),因为文本可能会有所不同。这是用于回收站的布局。

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable name="item" type="..." />
    </data>

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="@={item.enabled}"
        android:text="@{item.name}"
        android:minWidth="40dp"/>

</layout>

我的 Recycler 创建时宽度等于父

 <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

知道如何以百分比设置宽度吗?

如果您的 RecyclerView 布局正确,您可以通过覆盖 LayoutManager:

中的布局参数来强制 ViewHolder 大小
layoutManager = object : GridLayoutManager(context, 3, GridLayoutManager.HORIZONTAL, false){
    override fun checkLayoutParams(lp: RecyclerView.LayoutParams) : Boolean {
        // force width of viewHolder to be a fraction of RecyclerViews
        // this will override layout_width from xml
        lp.width = width / spanCount
        return true
    }
}

通过指定 GridLayoutManager.HORIZONTAL,您已告知回收器视图填充 left-to-right,而不是 top-to-bottom。通过说您想要 spanCount 的 3,您实际要求的是每个 最多包含 3 个项目。这就是为什么您的项目在溢出到第二列之前在第一列中从 1 变为 3,而不是在第一行中从 1 变为 3。

虽然在很多情况下这是可取的,但从你问题的措辞来看,我怀疑你想要固定数量的列 (3),并且每列具有 33% 的宽度。您可以通过使用 GridLayoutManager.VERTICAL 方向并将每个 child 的大小设置为 MATCH_PARENT 来实现此目的,这应该会产生您想要的效果。