Sobes.tech
Middle

Kaip sukurti savo RecyclerView.Adapter, skirtą naudoti Android programoje?

sobes.tech AI

Atsakymas iš AI

  1. Sukurkite klasę, kuri paveldi RecyclerView.Adapter<ViewHolder>. Kur ViewHolder yra vidinė klasė, paveldinti RecyclerView.ViewHolder.

  2. Įgyvendinkite tris abstrakčius metodus:

    • onCreateViewHolder(parent: ViewGroup, viewType: Int): sukuria naują ViewHolder egzempliorių. Paprastai čia vyksta elemento maketo inflacija.
    • onBindViewHolder(holder: ViewHolder, position: Int): susieja duomenis su ViewHolder elementais nurodytoje pozicijoje.
    • getItemCount(): Int: grąžina bendrą duomenų rinkinio elementų skaičių.
  3. Viduje adapterio klasės apibrėžkite duomenų sąrašą arba kitą konteinerį, kuriame bus saugomi duomenys.

  4. onCreateViewHolder metode gauti LayoutInflater iš tėvo konteksto, tada iškviesti inflater.inflate() norint sukurti sąrašo elemento View. Paduoti sukurtą View į ViewHolder konstruktorių.

  5. Vidinėje ViewHolder klasėje gauti nuorodas į sąrašo elemento maketo View elementus, su kuriais dirbti reikia. Tai daroma ViewHolder konstruktoriuje, kuris gauna View.

  6. onBindViewHolder metode naudoti position, kad gauti atitinkamą duomenų elementą iš kolekcijos. Tada nustatyti View elementų savybes holder remiantis šiuo duomeniu.

  7. Pridėti metodus duomenų atnaujinimui adapteryje (pvz., setData(newData: List<Item>) arba addItem(item: Item)). Po duomenų pakeitimo būtina iškviesti metodus, informuojančius RecyclerView apie pakeitimus, pvz., notifyDataSetChanged() arba tikslesnius notifyItemInserted(), notifyItemRemoved(), notifyItemChanged(), notifyItemRangeChanged().

Pavyzdinė struktūra:

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

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

        init {
            // Apibrėžti paspaudimo klausytoją ViewHolder'o View.
            textView = view.findViewById(R.id.textView) // Pavyzdinis ID iš maketo
        }
    }

    // Kurti naujus vaizdus (kviečia maketo valdytojas)
    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
        // Kurti naują vaizdą, kuris apibrėžia sąrašo elemento UI
        val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.item_layout, viewGroup, false) // Pavyzdinis ID iš maketo

        return MyViewHolder(view)
    }

    // Pakeisti turinį vaizde (kviečia maketo valdytojas)
    override fun onBindViewHolder(viewHolder: MyViewHolder, position: Int) {
        // Gauti duomenų elementą iš duomenų rinkinio šioje pozicijoje ir pakeisti
        // `View` elementų savybes pagal šiuos duomenis
        viewHolder.textView.text = dataSet[position]
    }

    // Grąžinti duomenų rinkinio dydį (kviečia maketo valdytojas)
    override fun getItemCount() = dataSet.size

    fun updateData(newData: List<String>) {
        dataSet = newData
        notifyDataSetChanged() // Arba tikslesni notify* metodai
    }
}
  1. Veikloje arba fragmento, kur naudojamas RecyclerView, sukurkite šio adapterio egzempliorių ir nustatykite jį RecyclerView naudojant setAdapter(). Taip pat nepamirškite nustatyti LayoutManager (pvz., LinearLayoutManager).
// Veikloje/Fragmento
val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // Pavyzdinis ID
val layoutManager = LinearLayoutManager(this) // Arba kitas layout valdytojas
recyclerView.layoutManager = layoutManager
val myAdapter = MyAdapter(initialData)
recyclerView.adapter = myAdapter

// Duomenų atnaujinimas
myAdapter.updateData(newData)