首页 > 解决方案 > Android RecyclerView 水平 GridLayoutManager 与装饰错误?

问题描述

各位大佬在使用水平RecyclerViewItemDecoration的时候遇到了一些问题,我想实现不同的装饰高度但是水平recyclerview的装饰高度总是一样的,图片和代码在下面,我在垂直GridLayoutManger中使用相同的代码是有效的,我看到了源码水平recyclerview有特殊处理的时候要测code,这正常吗?

图片

class MainItemDecoration : RecyclerView.ItemDecoration() {

    private val space20 = (Resources.getSystem().displayMetrics.density * 20).toInt()

    override fun getItemOffsets(
        outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State
    ) {
    val lp = view.layoutParams as GridLayoutManager.LayoutParams

    outRect.left = space20
    outRect.right = space20
        when (lp.spanIndex) {
            0 -> {
                outRect.bottom = 0
            }
            1 -> {
                outRect.bottom = space20
            }
            2 -> {
                outRect.bottom = space20 * 2
            }
        }
    }
}

- - - 主要活动 - -

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
        recyclerView.apply {
            layoutManager = GridLayoutManager(context, 3, GridLayoutManager.HORIZONTAL, false)
            adapter = MainAdapter()
            addItemDecoration(MainItemDecoration())
        }
    }
}

--- xml-------

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_red_light"
        tools:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
        tools:listitem="@layout/item_main"
        tools:orientation="horizontal"
        tools:spanCount="3" />

</FrameLayout>

- - 物品 - -

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/text"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_gravity="center"
        android:background="@android:color/holo_blue_light"
        android:gravity="center"
        android:textColor="@android:color/white"
        android:textSize="16sp"
        tools:text="123" />

</FrameLayout>

标签: androidandroid-recyclerview

解决方案


推荐阅读