Sobes.tech
Middle

ItemDecoration nedir ve Android'de nasıl kullanılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

ItemDecoration, RecyclerView içindeki bireysel öğelerin etrafına veya tüm RecyclerView tuvali üzerine dekorasyonlar çizmek için kullanılır.

Ana fonksiyonlar:

  • Öğeler arasına ayırıcılar (çizgiler, boşluklar) çizmek.
  • Öğeler için arka planlar veya çerçeveler çizmek.
  • Öğeler etrafına boşluklar (padding) eklemek öğenin kendisinin layout parametrelerini değiştirmeden.

Kullanım şekli:

  1. RecyclerView.ItemDecoration'dan türeyen bir sınıf oluşturun.
  2. Gerekli metodları geçersiz kılın:
    • onDraw(Canvas c, RecyclerView parent, RecyclerView.State state): öğelerin altına dekorasyonlar çizmek için.
    • onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state): öğelerin üstüne dekorasyonlar çizmek için.
    • getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state): öğenin sınırlarına boşluklar eklemek için.
  3. ItemDecoration sınıfından bir örnek oluşturun.
  4. Bunu addItemDecoration(ItemDecoration decoration) ile RecyclerView'a ekleyin.

getItemOffsets kullanımıyla boşluk ekleme örneği:

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 // Sadece ilk öğe için üst boşluk
            }
            left =  spaceHeight
            right = spaceHeight
            bottom = spaceHeight
        }
    }
}

// RecyclerView ayarlandığında:
// val recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view)
// recyclerView.addItemDecoration(SpaceItemDecoration(resources.getDimensionPixelSize(R.dimen.item_space)))

onDraw kullanımıyla ayırıcı çizme örneği:

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) { // Son öğe hariç
            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) {
        if (parent.getChildAdapterPosition(view) != parent.adapter?.itemCount?.minus(1)) {
            outRect.bottom = dividerHeight
        }
    }
}

// RecyclerView ayarlandığında:
// 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)))

Önemli olan, ItemDecoration'ın öğelerin boyutlarını veya konumlarını değiştirmediği, sadece çizim ve boşluklar üzerinde etkili olduğudur.