android - 如何在GridLayout中设置RecylerView项目装饰

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

我有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
    }
}
但是正如我所料,我得到了错误的行为。顶部/底部是可以的,但是例如,如果我向SpacingItemDecorator传递16个填充(如我所说的,我连续有2个项目),则第一个项目将按预期在左侧获得8,但在项目之间有空格将为16(第一个项目的右边是8,第二个项目的左边是8)。
但最奇怪的是,第二项也从右边获得16,而不是仅8(右边距)
我的问题是:
  • 为什么我行中的第二个项目从右侧获得16个填充,而不是第一个项目从左侧获得8个填充?
  • 如何为所有尺寸设置相同的填充?
  • 最佳答案

    要为每个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的地方),您都可以添加此项目装饰器,并将其padding设置为4:
    val x = (resources.displayMetrics.density * 4).toInt() //converting dp to pixels
    recyclerView.addItemDecoration(SpacingItemDecorator(x)) //setting space between items in RecyclerView
    
    结果:
    enter image description here

    关于android - 如何在GridLayout中设置RecylerView项目装饰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63809035/

    相关文章:

    android - 如何在不离开YouTube channel 的情况下将youtube channel 集成到Android应用中

    java - 无法为 com.android.build.gradle.internal.api.DefaultAndroidSourceSet 类型的源集 main 设置未知属性 's'

    java - 为什么我收到 @Provides-annotated 错误?

    kotlin - 如何使用 Kotlin 将嵌套的 if-else 更改为 when 语句?

    android - 如何使用 SherlockListFragment 启动有 Intent 的新 Activity ?

    java - Firebase 数据库获取节点值

    java - 如何获取最新的共享首选项

    java - 在框架布局中显示 Activity

    android - 当我使用 LinearLayout.addView() 时,我的 Android 应用程序崩溃

    kotlin - 装箱可为空整数的奇怪行为