Sobes.tech
Middle

Qu'est-ce que ItemDecoration et comment l'utiliser dans Android ?

sobes.tech IA

Réponse de l'IA

ItemDecoration est utilisé pour dessiner des décorations autour d'éléments individuels de RecyclerView ou sur toute la toile de RecyclerView.

Fonctions principales :

  • Dessiner des séparateurs entre les éléments (lignes, marges).
  • Dessiner des arrière-plans ou des cadres pour les éléments.
  • Ajouter des marges (padding) autour des éléments sans modifier les paramètres de mise en page de l'élément lui-même.

Comment l'utiliser :

  1. Créer une classe qui hérite de RecyclerView.ItemDecoration.
  2. Surcharger les méthodes nécessaires :
    • onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) : pour dessiner des décorations sous les éléments.
    • onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) : pour dessiner des décorations au-dessus des éléments.
    • getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) : pour ajouter des marges aux bords de l'élément.
  3. Créer une instance de la classe ItemDecoration.
  4. L'ajouter à RecyclerView avec addItemDecoration(ItemDecoration decoration).

Exemple d'utilisation de getItemOffsets pour ajouter une marge :

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 // Marge en haut uniquement pour le premier élément
            }
            left =  spaceHeight
            right = spaceHeight
            bottom = spaceHeight
        }
    }
}

// Dans le code où le RecyclerView est configuré :
// val recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view)
// recyclerView.addItemDecoration(SpaceItemDecoration(resources.getDimensionPixelSize(R.dimen.item_space)))

Exemple d'utilisation de onDraw pour dessiner un séparateur :

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) { // Itérer jusqu'à l'avant-dernier élément
            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) {
        // Ajouter de l'espace pour le séparateur si ce n'est pas le dernier élément
        if (parent.getChildAdapterPosition(view) != parent.adapter?.itemCount?.minus(1)) {
            outRect.bottom = dividerHeight
        }
    }
}

// Dans le code où le RecyclerView est configuré :
// 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)))

Il est important de comprendre que ItemDecoration ne modifie pas la taille ou la disposition des éléments eux-mêmes, il influence uniquement leur rendu et leurs marges.