Middle
ItemDecoration чист ва чӣ тавр дар Android истифода мешавад?
sobes.tech AI
Ҷавоб аз AI
ItemDecoration барои расмкашии ороишот атрофи унсурҳои алоҳидаи RecyclerView ё болои тамоми тахтаи RecyclerView истифода мешавад.
Функсияҳои асосӣ:
- Расмкашии ҷудокунандагон байни унсурҳо (хатҳо, фосилаҳо).
- Расмкашии заминаҳо ё чаҳорчӯбаҳо барои унсурҳо.
- Илова кардани фосилаҳо (padding) атрофи унсурҳо бе тағир додани параметрҳои тарҳрезии худи унсур.
Чӣ гуна истифода бурдан:
- Синфи, ки аз
RecyclerView.ItemDecorationмерос мегирад, эҷод кунед. - Методҳои заруриро ислоҳ кунед:
onDraw(Canvas c, RecyclerView parent, RecyclerView.State state): барои расмкашии ороишот зери унсурҳо.onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state): барои расмкашии ороишот болои унсурҳо.getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state): барои илова кардани фосилаҳо ба марзҳои унсур.
- Нусхаи синфро эҷод кунед.
- Онро ба
RecyclerViewбо ёрииaddItemDecoration(ItemDecoration decoration)илова кунед.
Масалан барои истифодаи getItemOffsets барои иловаи фосила:
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 // Фосила аз боло танҳо барои аввалин унсур
}
left = spaceHeight
right = spaceHeight
bottom = spaceHeight
}
}
}
// Дар коди, ки RecyclerView танзим карда мешавад:
// val recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view)
// recyclerView.addItemDecoration(SpaceItemDecoration(resources.getDimensionPixelSize(R.dimen.item_space)))
Масалан барои истифодаи onDraw барои расмкашии ҷудокунанда:
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) { // то ба пешпоследин унсур
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 танзим карда мешавад:
// 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)))
Муҳим аст, ки фаҳмед, ки ItemDecoration мебозад андозаҳо ё ҷойгиршавии унсурҳоро, балки танҳо ба расмкашӣ ва фосилаҳо дар атрофи онҳо таъсир мерасонад.