Sobes.tech
Middle

ItemDecoration რა არის და როგორ გამოიყენება Android-ში?

sobes.tech AI

პასუხი AI-სგან

ItemDecoration გამოიყენება ცალკეული ელემენტების RecyclerView გარშემო დეკორაციების გამოსახატავად ან მთლიანი RecyclerView ფურცელზე.

ძირითადი ფუნქციები:

  • ელემენტებს შორის გამყოფების (ხაზები, შუალედები) ხატვა.
  • ელემენტებისთვის ფონებისა ან ჩარჩოების ხატვა.
  • შუალედების (padding) დამატება ელემენტების გარშემო без თვით ელემენტის lay-out პარამეტრების შეცვლის.

როგორ გამოიყენოთ:

  1. შექმენით კლასი, რომელიც იშვიათად იწერება RecyclerView.ItemDecoration-სგან.
  2. გადახედეთ საჭირო მეთოდებს:
    • 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): შუალედების დამატება ელემენტის საზღვრებზე.
  3. შექმენით ItemDecoration კლასი.
  4. დაამატეთ იგი 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 არ იცვლის ელემენტების ზომებს ან განლაგებას, ის მხოლოდ გავლენას ახდენს მათი ხატვაზე და შუალედებზე.