Middle
Mi az az ItemDecoration, és hogyan használják az Androidban?
sobes.tech MI
Válasz az MI-től
Az ItemDecoration a RecyclerView egyedi elemeinek vagy az egész RecyclerView vásznának dekorációinak megrajzolására szolgál.
Fő funkciók:
- Elválasztók (vonalak, margók) rajzolása az elemek között.
- Háttér vagy keret rajzolása az elemekhez.
- Margók (padding) hozzáadása az elemek körül az elem saját elrendezési paramétereinek módosítása nélkül.
Hogyan használjuk:
- Hozzon létre egy osztályt, amely örökli a
RecyclerView.ItemDecoration-t. - Felülírja a szükséges metódusokat:
onDraw(Canvas c, RecyclerView parent, RecyclerView.State state): dekorációk rajzolása az elemek alatt.onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state): dekorációk rajzolása az elemek fölött.getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state): margók hozzáadása az elem határaihoz.
- Létrehoz egy példányt az
ItemDecorationosztályból. - Hozzáadja a
RecyclerView-hoz azaddItemDecoration(ItemDecoration decoration)segítségével.
Példa a getItemOffsets használatára margó hozzáadásához:
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 // Margó csak az első elem fölött
}
left = spaceHeight
right = spaceHeight
bottom = spaceHeight
}
}
}
// A RecyclerView konfigurálásánál:
// val recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view)
// recyclerView.addItemDecoration(SpaceItemDecoration(resources.getDimensionPixelSize(R.dimen.item_space)))
Példa az onDraw használatára elválasztó rajzolásához:
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) { // az utolsó előtti elemig
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) {
// hely hozzáadása a elválasztó számára, kivéve az utolsó elemet
if (parent.getChildAdapterPosition(view) != parent.adapter?.itemCount?.minus(1)) {
outRect.bottom = dividerHeight
}
}
}
// A RecyclerView konfigurálásánál:
// 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)))
Fontos megérteni, hogy az ItemDecoration nem változtatja meg az elemek méretét vagy elhelyezkedését, csak azok rajzolását és margóit befolyásolja.