Sobes.tech
Middle

Ako vytvoriť vlastný RecyclerView.Adapter na použitie v aplikácii Android?

sobes.tech AI

Odpoveď od AI

  1. Vytvorte triedu, ktorá dedí od RecyclerView.Adapter<ViewHolder>. Kde ViewHolder je vnútorná trieda, ktorá dedí od RecyclerView.ViewHolder.

  2. Implementujte tri abstraktné metódy:

    • onCreateViewHolder(parent: ViewGroup, viewType: Int): Vytvorí nový príkladok ViewHolder. Zvyčajne tu dochádza k inflate layoutu prvku zoznamu.
    • onBindViewHolder(holder: ViewHolder, position: Int): Spája údaje s prvkami z ViewHolder pre danú pozíciu.
    • getItemCount(): Int: Vráti celkový počet prvkov v súbore údajov.
  3. Vo vnútri triedy adaptéra určte zoznam alebo iný kontajner na uloženie údajov, ktoré sa budú zobrazovať.

  4. V metóde onCreateViewHolder získajte LayoutInflater z kontextu parent, potom zavolajte inflater.inflate() na vytvorenie View prvku zoznamu. Odovzdajte vytvorený View do konštruktora ViewHolder.

  5. Vo vnútornej triede ViewHolder získajte odkazy na View prvky layoutu prvku zoznamu, s ktorými je potrebné pracovať. To sa robí v konštruktore ViewHolder, ktorý prijíma View.

  6. V metóde onBindViewHolder použite position na získanie zodpovedajúceho prvku údajov z kolekcie. Potom nastavte hodnoty vlastností View prvkov v holder na základe údajov z tohto prvku.

  7. Pridajte metódy na aktualizáciu údajov v adaptéri (napríklad setData(newData: List<Item>) alebo addItem(item: Item)). Po zmene údajov je potrebné zavolať metódy, ktoré informujú RecyclerView o zmenách, napríklad notifyDataSetChanged() alebo špecifickejšie notifyItemInserted(), notifyItemRemoved(), notifyItemChanged(), notifyItemRangeChanged().

Príklad štruktúry:

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

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

        init {
            // Definujte klikacieho poslucháča pre ViewHolder-ov View.
            textView = view.findViewById(R.id.textView) // Príklad ID z layoutu
        }
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.item_layout, viewGroup, false) // Príklad ID layoutu prvku
        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() // Alebo presnejšie notify*
    }
}
  1. V aktivite alebo fragmente, kde sa používa RecyclerView, vytvorte inštanciu tohto adaptéra a nastavte ho na RecyclerView pomocou metódy setAdapter(). Taktiež nezabudnite nastaviť LayoutManager pre RecyclerView (napríklad LinearLayoutManager).
// V Activity/Fragment
val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // Príklad ID
val layoutManager = LinearLayoutManager(this) // Alebo iný layout manager
recyclerView.layoutManager = layoutManager
val myAdapter = MyAdapter(initialData)
recyclerView.adapter = myAdapter

// Aktualizácia údajov
myAdapter.updateData(newData)