Sobes.tech
Middle

Jak vytvořit svůj vlastní RecyclerView.Adapter pro použití v aplikaci na Androidu?

sobes.tech AI

Odpověď od AI

  1. Vytvořte třídu, která dědí od RecyclerView.Adapter<ViewHolder>. Kde ViewHolder je vnitřní třída, která dědí od RecyclerView.ViewHolder.

  2. Implementujte tři abstraktní metody:

    • onCreateViewHolder(parent: ViewGroup, viewType: Int): Vytvoří nový instance ViewHolder. Obvykle zde dochází k inflate layoutu prvku seznamu.
    • onBindViewHolder(holder: ViewHolder, position: Int): Propojuje data s prvky z ViewHolder na dané pozici.
    • getItemCount(): Int: Vrací celkový počet prvků v datové sadě.
  3. Uvnitř třídy adaptéru definujte seznam nebo jinou kontejner pro uchovávání dat, která se budou zobrazovat.

  4. V metodě onCreateViewHolder získejte LayoutInflater z kontextu parent, poté zavolejte inflater.inflate() pro vytvoření View prvku seznamu. Předáte vytvořený View do konstruktoru ViewHolder.

  5. Uvnitř vnitřní třídy ViewHolder získejte odkazy na View prvky layoutu prvku seznamu, se kterými je třeba pracovat. To se provádí v konstruktoru ViewHolder, který přijímá View.

  6. V metodě onBindViewHolder použijte position k získání odpovídajícího prvku dat z kolekce. Poté nastavte hodnoty vlastností View prvků v holder na základě dat z tohoto prvku.

  7. Přidejte metody pro aktualizaci dat v adapteru (například setData(newData: List<Item>) nebo addItem(item: Item)). Po změně dat je třeba zavolat metody, které informují RecyclerView o změnách, například notifyDataSetChanged() nebo specifičtější notifyItemInserted(), notifyItemRemoved(), notifyItemChanged(), notifyItemRangeChanged().

Příklad struktury:

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

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

        init {
            // Definujte klikací posluchač pro ViewHolderův View.
            textView = view.findViewById(R.id.textView) // Pří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) // Pří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() // Nebo přesnější notify*
    }
}
  1. V aktivitě nebo fragmentu, kde je použit RecyclerView, vytvořte instanci tohoto adaptéru a nastavte jej na RecyclerView pomocí metody setAdapter(). Také nezapomeňte nastavit LayoutManager pro RecyclerView (například LinearLayoutManager).
// V Activity/Fragment
val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // Příklad ID
val layoutManager = LinearLayoutManager(this) // Nebo jiný layout manager
recyclerView.layoutManager = layoutManager
val myAdapter = MyAdapter(initialData)
recyclerView.adapter = myAdapter

// Aktualizace dat
myAdapter.updateData(newData)