Middle
Czym jest ItemDecoration i jak jest używany w Android?
sobes.tech AI
Odpowiedź od AI
ItemDecoration jest używany do rysowania dekoracji wokół poszczególnych elementów RecyclerView lub na całym płótnie RecyclerView.
Główne funkcje:
- Rysowanie separatorów między elementami (linie, marginesy).
- Rysowanie tła lub ramek dla elementów.
- Dodawanie marginesów (padding) wokół elementów bez zmiany parametrów układu samego elementu.
Jak go używać:
- Utwórz klasę dziedziczącą po
RecyclerView.ItemDecoration. - Nadpisz potrzebne metody:
onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)— do rysowania dekoracji pod elementami.onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)— do rysowania dekoracji nad elementami.getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)— do dodawania marginesów do krawędzi elementu.
- Utwórz instancję klasy
ItemDecoration. - Dodaj ją do
RecyclerViewza pomocąaddItemDecoration(ItemDecoration decoration).
Przykład użycia getItemOffsets do dodania marginesu:
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 // margines u góry tylko dla pierwszego elementu
}
left = spaceHeight
right = spaceHeight
bottom = spaceHeight
}
}
}
// W kodzie, gdzie konfiguruje się RecyclerView:
// val recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view)
// recyclerView.addItemDecoration(SpaceItemDecoration(resources.getDimensionPixelSize(R.dimen.item_space)))
Przykład użycia onDraw do rysowania separatora:
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) { // iteracja do przedostatniego elementu
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) {
// dodanie miejsca pod separator, jeśli nie jest ostatnim elementem
if (parent.getChildAdapterPosition(view) != parent.adapter?.itemCount?.minus(1)) {
outRect.bottom = dividerHeight
}
}
}
// W kodzie, gdzie konfiguruje się 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)))
Ważne jest, aby zrozumieć, że ItemDecoration nie zmienia rozmiarów ani układu samych elementów, a jedynie wpływa na ich rysunek i marginesy wokół nich.