Sobes.tech
Middle

Hoe maak je je eigen RecyclerView.Adapter voor gebruik in een Android-app?

sobes.tech AI

Antwoord van AI

  1. Maak een klasse die erft van RecyclerView.Adapter<ViewHolder>. Waar ViewHolder een interne klasse is die erft van RecyclerView.ViewHolder.

  2. Implementeer drie abstracte methoden:

    • onCreateViewHolder(parent: ViewGroup, viewType: Int): Maakt een nieuwe instantie van ViewHolder. Hier wordt meestal het inflaten van het layout van het lijstitem gedaan.
    • onBindViewHolder(holder: ViewHolder, position: Int): Koppelt de gegevens aan de elementen van ViewHolder voor de aangegeven positie.
    • getItemCount(): Int: Geeft het totale aantal elementen in de dataset terug.
  3. Binnen de adapterklasse, definieer een lijst of een andere container om de te tonen gegevens op te slaan.

  4. In de methode onCreateViewHolder, haal LayoutInflater uit de context van parent, en roep vervolgens inflater.inflate() aan om het View-element van de lijst te maken. Geef de gemaakte View door aan de constructor van ViewHolder.

  5. Binnen de interne klasse ViewHolder, haal referenties op naar de View-elementen van het layout van het lijstitem, waarmee gewerkt moet worden. Dit gebeurt in de constructor van ViewHolder, die een View ontvangt.

  6. In de methode onBindViewHolder, gebruik position om het juiste gegevensitem uit de collectie te krijgen. Stel vervolgens de waarden van de eigenschappen van de View-elementen in holder in op basis van de gegevens van dat item.

  7. Voeg methoden toe om de gegevens in de adapter bij te werken (bijvoorbeeld setData(newData: List<Item>) of addItem(item: Item)). Na het wijzigen van de gegevens, moet je methoden aanroepen die RecyclerView informeren over de wijzigingen, zoals notifyDataSetChanged() of meer specifieke zoals notifyItemInserted(), notifyItemRemoved(), notifyItemChanged(), notifyItemRangeChanged().

Voorbeeldstructuur:

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

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

        init {
            // Definieer kliklistener voor de ViewHolder's View.
            textView = view.findViewById(R.id.textView) // Voorbeeld ID uit layout
        }
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.item_layout, viewGroup, false) // Voorbeeld ID van layout
        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() // Of meer specifieke notify*
    }
}
  1. In de activiteit of fragment waar RecyclerView wordt gebruikt, maak een instantie van deze adapter en stel deze in op de RecyclerView met behulp van de methode setAdapter(). Vergeet ook niet om een LayoutManager in te stellen voor de RecyclerView (bijvoorbeeld LinearLayoutManager).
// In Activity/Fragment
val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // Voorbeeld ID
val layoutManager = LinearLayoutManager(this) // Of andere layout manager
recyclerView.layoutManager = layoutManager
val myAdapter = MyAdapter(initialData)
recyclerView.adapter = myAdapter

// Gegevens bijwerken
myAdapter.updateData(newData)