RecyclerView之ItemDecoration

使用

RecyclerView.ItemDecoration用來裝飾RecyclerView的itemView,我們常用來做分割線,但它的功能不僅是分割線。
實現ItemDecoration,需要實現子類,主要實現他的兩個主要方法

/**
  這個方法主要是獲取itemView的範圍
  outRect就是擴展參數,0表示範圍跟itemView範圍一樣。
  >0表示範圍外擴(如果無法外擴則邊界預留)。
  outRect.top=10,表示上邊界外擴 10px (如果範圍超出了RecyclerView區域,表示0-10px用於繪製邊界,不會用於itemView的展示)
**/
   override fun getItemOffsets(
        outRect: Rect, view: View, parent: RecyclerView,state: RecyclerView.State
    )
/** 
    畫裝飾條目,需要繪製出全部item的裝飾。一般根據itemView的LayoutParam,定位到canvas繪製的位置 
**/
    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State)

代碼片

package com.me.kotlinlearn

import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.RecyclerView

class MyDecoration(val isVertical: Boolean, val colorValue:Int, val size:Int) : RecyclerView.ItemDecoration() {
    public constructor() : this(false, Color.parseColor("#ff000000"), 100)

    private val paint = Paint().apply {
        flags = Paint.ANTI_ALIAS_FLAG
        color = colorValue
    }

   
    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        super.getItemOffsets(outRect, view, parent, state)
        if(isVertical) {
            outRect.set(0, 0, size, 0)
        } else {
            outRect.set(0, 0, 0, size)
        }
    }

    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        super.onDraw(c, parent, state)
        if (isVertical) {
            drawVertical(c, parent, state)
        } else {
            drawHorizontal(c, parent, state)
        }
    }

    /**
     * 畫水平分割線
     */
    private fun drawHorizontal(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        for(i in 0 until parent.childCount) {
            val child = parent.getChildAt(i)
            val param = child.layoutParams as RecyclerView.LayoutParams
            val left = child.left - param.leftMargin
            val top = child.bottom + param.bottomMargin
            val right = child.right + param.rightMargin
            val bottom = top + size
            c.drawRect(Rect(left, top, right, bottom), paint)
        }
    }

    /**
    * 畫豎直分割線
    **/
    private fun drawVertical(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        for(i in 0 until parent.childCount) {
            val child = parent.getChildAt(i)
            val param = child.layoutParams as RecyclerView.LayoutParams
            val left = child.right + param.rightMargin
            val top = child.top - param.topMargin
            val right = left + size
            val bottom = child.bottom + param.bottomMargin
            c.drawRect(Rect(left, top, right,bottom), paint)
        }
    }
}

RecyclerView提供的ItemDecoration

DividerItemDecoration

用來爲線性佈局提供分割線。分割線可直接在layout中實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章