在 Recyclerview Kotlin 的顶部、中间和底部添加分隔线

Posted

技术标签:

【中文标题】在 Recyclerview Kotlin 的顶部、中间和底部添加分隔线【英文标题】:Add Divider Top,Middle and Bottom of Recyclerview Kotlin 【发布时间】:2021-11-23 05:24:30 【问题描述】:

嘿,我想在 Recyclerview 的顶部、中间和底部显示分隔线。 How to add dividers and spaces between items in RecyclerView。它可以在中间和底部添加分隔线。但我找不到在第一项之上添加分隔线。有谁知道如何实现这一目标?提前致谢。

import android.content.Context
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.view.View
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.letsgetchecked.app.R


class SimpleDividerItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() 

    private var drawable: Drawable? = ContextCompat.getDrawable(context, R.drawable.cloudy)

    override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) 
        val left: Int = parent.paddingLeft
        val right: Int = parent.width - parent.paddingRight

        val childCount: Int = parent.childCount
        for (i in 0 until childCount) 
            val child: View = parent.getChildAt(i)
            val params = child.layoutParams as RecyclerView.LayoutParams
            val top: Int = child.bottom + params.bottomMargin
            val bottom: Int = top + drawable?.intrinsicHeight!!
            drawable?.setBounds(left, top, right, bottom)
            drawable?.draw(c)
        
    

预期输出

我得到了什么

【问题讨论】:

这些可能会有所帮助:***.com/questions/47778105/…、***.com/questions/48778082/…。 【参考方案1】:

您不需要编写自己的课程。您这样做的方式不考虑分隔线的厚度,因此可能会导致列表项中的填充不准确。使用提供的类 DividerItemDecoration。

但是,它也缺少顶部项目上方的分隔线。这是一个可以添加为第二个装饰的类。它仅在第一个项目上画了一个分隔线,因此您可以自定义它以使其看起来与其他项目不同,我认为出于可用性原因这是一个好主意。我将它基于 DividerItemDecoration 的来源,因此它正确地考虑了填充和裁剪。

class TopDividerItemDecoration(val context: Context) : RecyclerView.ItemDecoration() 
    private val bounds = Rect()
    private var _drawable: Drawable? =
        context.obtainStyledAttributes(intArrayOf(android.R.attr.listDivider)).use 
            it.getDrawable(0)
        
    var drawable: Drawable
        get() = _drawable
            ?: error("A drawable must be set before use. Current theme lacks default divider.")
        set(value) 
            _drawable = value
        

    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) 
        if (parent.layoutManager == null || parent.childCount == 0)
            return

        c.save()
        if (parent.clipToPadding) 
            c.clipRect(
                parent.paddingLeft, parent.paddingTop, parent.width - parent.paddingRight,
                parent.height - parent.paddingBottom
            )
        

        val child = parent.getChildAt(0)
        parent.getDecoratedBoundsWithMargins(child, bounds)
        val top = bounds.top + child.translationY.roundToInt()
        val bottom = top + drawable.intrinsicHeight
        drawable.setBounds(0, top, parent.width, bottom)
        drawable.draw(c)

        c.restore()
    

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) 
        super.getItemOffsets(outRect, view, parent, state)
        if (parent.getChildLayoutPosition(view) == 0) 
            outRect.top += drawable.intrinsicHeight
        
    

【讨论】:

此逻辑仅有助于显示顶部分隔线或显示在顶部中间和底部? 它只绘制顶部,就像我在答案中所说的那样。 我该如何管理这两个代码? 将两个装饰添加到您的适配器 好的,我会尝试添加@tenfour04

以上是关于在 Recyclerview Kotlin 的顶部、中间和底部添加分隔线的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio(Kotlin)之RecyclerView

Kotlin 中的 RecyclerView itemClickListener [关闭]

Recyclerview没有显示kotlin [重复]

当 Kotlin 中的数据发生变化时,如何在 RecyclerView 中重新绑定项目?

Kotlin中实现RecyclerView嵌套RecyclerView

Recyclerview 未显示来自 Firebase Kotlin 的数据