【问题标题】:How to set RecylerView item decoration in a GridLayout如何在 GridLayout 中设置 RecyclerView 项目装饰
【发布时间】:2020-09-09 09:47:06
【问题描述】:

我有 2 个跨度的简单网格布局,我的 RecyclerView 项目布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/categoryCardView"
        android:layout_width="170dp"
        android:layout_height="100dp"
        app:cardBackgroundColor="@color/colorPrimary"
        app:cardCornerRadius="10dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>

我想要的基本上是四面八方的空间,所以我这样设置物品装饰:

        recylcerView.addItemDecoration(SpacingItemDecorator(16))

class SpacingItemDecorator (private val padding: Int): RecyclerView.ItemDecoration() {
    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        super.getItemOffsets(outRect, view, parent, state)
//        outRect.right = padding
//        outRect.top = padding * 2

        outRect.top = padding
        outRect.right = padding/2
        outRect.left = padding/2
    }
}

但正如我所料,我遇到了错误的行为。顶部/底部没问题,但例如,如果我将 16 填充传递给 SpacingItemDecorator(正如我所说我连续有 2 个项目),第一个项目将按预期在左侧得到 8,但在项目之间, 空间将为 16(第一项右侧为 8,第二项左侧为 8)。

但最奇怪的是,第二个项目也从右边得到 16,而不是只有 8(右填充)

我的问题是:

  1. 为什么我的行中的第二个项目会从右边得到 16 个填充,而不是第一个项目从左边得到 8 个?

  2. 如何为所有尺寸设置相同的填充?

【问题讨论】:

  • 所以你只想得到等于8dp的填充?
  • @iknow 是的,我当然尝试为项目的根约束布局提供填充,但它仍然在项目之间提供两次填充
  • 您没有为卡设置左约束。看来你根本不需要约束,因为你只有一个孩子(你的卡)

标签: android android-layout kotlin android-recyclerview android-arrayadapter


【解决方案1】:

要为每个 RecyclerView 项目获取 8dp 填充您可以将 RecyclerView 填充设置为 4dp

<androidx.recyclerview.widget.RecyclerView
    android:padding="4dp"
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
    app:spanCount="3"
    />

现在在你的 ItemDecorator 中添加这个:

class SpacingItemDecorator (private val padding: Int) : RecyclerView.ItemDecoration()
{
    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    )
    {
        super.getItemOffsets(outRect, view, parent, state)
        outRect.top = padding
        outRect.bottom = padding
        outRect.left = padding
        outRect.right = padding
    }
}

现在在onCreate(或您设置 RecylcerView 的任何位置)您可以添加此项目装饰器,并将填充设置为4

val x = (resources.displayMetrics.density * 4).toInt() //converting dp to pixels
recyclerView.addItemDecoration(SpacingItemDecorator(x)) //setting space between items in RecyclerView

结果:

【讨论】:

  • 工作非常感谢。为什么我需要将 dp 转换为像素?
【解决方案2】:

只需将您的卡片视图宽度布局设置为匹配父级,例如边距为 8dp。以及带有 wrap_content 的高度。在处理 recyclerViews 时。最好避免为宽度和高度设置特定的测量值。相信我,它会更容易,而且看起来更好。

附:在您的活动/片段中设置布局的尺寸会影响性能。最好在 xml 文件中宣布/定义 UI。

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多