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:
RecyclerView.ItemDecoration'dan türeyen bir sınıf oluşturun.- 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.
ItemDecorationsınıfından bir örnek oluşturun.- Bunu
addItemDecoration(ItemDecoration decoration)ileRecyclerView'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.