Sobes.tech
Middle

Comment créer votre propre RecyclerView.Adapter pour une utilisation dans une application Android?

sobes.tech IA

Réponse de l'IA

  1. Créer une classe héritant de RecyclerView.Adapter<ViewHolder>. Où ViewHolder est une classe interne héritant de RecyclerView.ViewHolder.

  2. Implémenter trois méthodes abstraites :

    • onCreateViewHolder(parent: ViewGroup, viewType: Int): Crée une nouvelle instance de ViewHolder. En général, c'est ici que l'inflation du layout de l'élément de la liste se produit.
    • onBindViewHolder(holder: ViewHolder, position: Int): Lie les données aux éléments du ViewHolder pour la position indiquée.
    • getItemCount(): Int: Retourne le nombre total d'éléments dans le jeu de données.
  3. À l'intérieur de la classe adaptateur, définir une liste ou un autre conteneur pour stocker les données à afficher.

  4. Dans la méthode onCreateViewHolder, obtenir LayoutInflater depuis le contexte de parent, puis appeler inflater.inflate() pour créer l'élément View de la liste. Passer la View créée au constructeur de ViewHolder.

  5. À l'intérieur de la classe interne ViewHolder, obtenir des références aux éléments View du layout de l'élément de la liste, avec lesquels travailler. Cela se fait dans le constructeur de ViewHolder, qui reçoit la View.

  6. Dans la méthode onBindViewHolder, utiliser position pour obtenir l'élément de données correspondant dans la collection. Ensuite, définir les valeurs des propriétés des éléments View dans holder en fonction des données de cet élément.

  7. Ajouter des méthodes pour mettre à jour les données dans l'adaptateur (par exemple, setData(newData: List<Item>) ou addItem(item: Item)). Après modification des données, appeler des méthodes pour informer RecyclerView des changements, comme notifyDataSetChanged() ou des méthodes plus spécifiques telles que notifyItemInserted(), notifyItemRemoved(), notifyItemChanged(), notifyItemRangeChanged().

Exemple de structure :

class MyAdapter(private var dataSet: List<String>) :
    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView

        init {
            // Définir le listener de clic pour la vue du ViewHolder.
            textView = view.findViewById(R.id.textView) // ID d'exemple du layout
        }
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.item_layout, viewGroup, false) // ID d'exemple du layout de l'élément
        return MyViewHolder(view)
    }

    override fun onBindViewHolder(viewHolder: MyViewHolder, position: Int) {
        viewHolder.textView.text = dataSet[position]
    }

    override fun getItemCount() = dataSet.size

    fun updateData(newData: List<String>) {
        dataSet = newData
        notifyDataSetChanged() // Ou méthodes notify* plus précises
    }
}
  1. Dans l'activité ou le fragment où RecyclerView est utilisé, créer une instance de cet adaptateur et le définir pour le RecyclerView avec la méthode setAdapter(). N'oubliez pas également de définir un LayoutManager pour le RecyclerView (par exemple, LinearLayoutManager).
// Dans Activity/Fragment
val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // ID d'exemple
val layoutManager = LinearLayoutManager(this) // Ou un autre layout manager
recyclerView.layoutManager = layoutManager
val myAdapter = MyAdapter(initialData)
recyclerView.adapter = myAdapter

// Mise à jour des données
myAdapter.updateData(newData)