Sobes.tech
Middle

Kas ir ItemDecoration un kā tas tiek izmantots Android?

sobes.tech AI

Atbilde no AI

ItemDecoration tiek izmantots, lai zīmētu dekorācijas ap atsevišķiem RecyclerView elementiem vai virs visa RecyclerView auduma.

Galvenās funkcijas:

  • Zīmēt starpsienas starp elementiem (līnijas, atstarpes).
  • Zīmēt fonus vai rāmjus elementiem.
  • Pievienot atstarpes (padding) ap elementiem ne mainot paša elementa izkārtojuma parametrus.

Kā lietot:

  1. Izveidojiet klasi, kas manto RecyclerView.ItemDecoration.
  2. Pārrakstiet nepieciešamās metodes:
    • onDraw(Canvas c, RecyclerView parent, RecyclerView.State state): dekorāciju zīmēšanai zem elementiem.
    • onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state): dekorāciju zīmēšanai virs elementiem.
    • getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state): atstarpju pievienošanai elementa robežām.
  3. Izveidojiet ItemDecoration klases eksemplāru.
  4. Pievienojiet to RecyclerView ar addItemDecoration(ItemDecoration decoration).

Piemērs, izmantojot getItemOffsets atstarpes pievienošanai:

class SpaceItemDecoration(private val spaceHeight: Int) : RecyclerView.ItemDecoration() {
    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        with(outRect) {
            if (parent.getChildAdapterPosition(view) == 0) {
                top = spaceHeight // Atstarpe augšpusē tikai pirmajam elementam
            }
            left =  spaceHeight
            right = spaceHeight
            bottom = spaceHeight
        }
    }
}

// Kodā, kur konfigurējat `RecyclerView`:
// val recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view)
// recyclerView.addItemDecoration(SpaceItemDecoration(resources.getDimensionPixelSize(R.dimen.item_space)))

Piemērs, izmantojot onDraw zīmēšanai starpsienu:

class DividerItemDecoration(private val dividerHeight: Int, private val dividerColor: Int) : RecyclerView.ItemDecoration() {
    private val paint = Paint().apply {
        color = dividerColor
        style = Paint.Style.FILL
    }

    override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        val left = parent.paddingLeft
        val right = parent.width - parent.paddingRight

        for (i in 0 until parent.childCount - 1) { // līdz priekšpēdējam elementam
            val child = parent.getChildAt(i)
            val top = child.bottom
            val bottom = top + dividerHeight
            canvas.drawRect(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat(), paint)
        }
    }

    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        // Pievienojam vietu starpsienai, ja tas nav pēdējais elements
        if (parent.getChildAdapterPosition(view) != parent.adapter?.itemCount?.minus(1)) {
            outRect.bottom = dividerHeight
        }
    }
}

// Kodā, kur konfigurējat `RecyclerView`:
// val recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view)
// recyclerView.addItemDecoration(DividerItemDecoration(resources.getDimensionPixelSize(R.dimen.divider_height), ContextCompat.getColor(this, R.color.divider_color)))

Svarīgi saprast, ka ItemDecoration ne maina elementu izmērus vai izkārtojumu, tas tikai ietekmē to zīmēšanu un atstarpes.