【问题标题】:Can I set the width of a column in percents in GridLayoutManager?我可以在 GridLayoutManager 中以百分比设置列的宽度吗?
【发布时间】:2019-03-27 17:52:45
【问题描述】:

我有一个包含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" />

任何想法如何以百分比设置宽度?

【问题讨论】:

  • 您是否尝试过更改复选框大小以匹配父级?
  • 是的,在这种情况下它只绘制第一列

标签: android gridlayoutmanager


【解决方案1】:

如果您的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
    }
}

【讨论】:

  • 如果我在大屏幕上(或旋转屏幕时)设置 5 列会怎样?
  • @MartinZeitler 我稍微改变了答案,您可以使用spanCount(列数)而不是硬编码“3”。现在取决于您如何修改传递给GridLayoutManager 的列数,例如创建自定义columnCount 整数资源,该资源将根据用户配置具有不同的值,并使用context.resources.getInteger(R.integer.columnCount) 获取它。
  • 它从何而来?还有一个吸气剂getSpanCount()。不是硬编码它在任何情况下都更好,因为动态列数很常见。
  • getSpanCount()GridLayoutManager 的 java 方法,由于互操作属性转换,它在 Kotlin 中可以作为 spanCount 使用。
  • 已经忘记了这种差异。这在 IDE 中总是更容易。
【解决方案2】:

通过指定GridLayoutManager.HORIZONTAL,您告诉回收站视图从左到右填充,而不是从上到下。通过说您想要一个为 3 的 spanCount,您实际上要求的是每个 中最多包含 3 个项目。这就是为什么您的项目在溢出到第二列之前从第一列中的 1 变为 3,而不是在第一行中从 1 变为 3。

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

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 2017-01-11
    • 1970-01-01
    • 2012-05-20
    • 2013-05-25
    • 2012-04-21
    • 2013-03-24
    • 2012-10-03
    • 2016-01-17
    相关资源
    最近更新 更多