Sobes.tech
Middle

Jak stworzyć własny RecyclerView.Adapter do użycia w aplikacji na Androida?

sobes.tech AI

Odpowiedź od AI

  1. Utwórz klasę dziedziczącą po RecyclerView.Adapter<ViewHolder>. Gdzie ViewHolder to klasa wewnętrzna dziedzicząca po RecyclerView.ViewHolder.

  2. Zaimplementuj trzy metody abstrakcyjne:

    • onCreateViewHolder(parent: ViewGroup, viewType: Int): Tworzy nowy egzemplarz ViewHolder. Zazwyczaj tutaj wykonywane jest inflowanie układu elementu listy.
    • onBindViewHolder(holder: ViewHolder, position: Int): Wiąże dane z elementami ViewHolder dla wskazanej pozycji.
    • getItemCount(): Int: Zwraca łączną liczbę elementów w zestawie danych.
  3. Wewnątrz klasy adaptera zdefiniuj listę lub inny kontener do przechowywania danych, które będą wyświetlane.

  4. W metodzie onCreateViewHolder pobierz LayoutInflater z kontekstu parent, a następnie wywołaj inflater.inflate() w celu utworzenia elementu View listy. Przekaż utworzony View do konstruktora ViewHolder.

  5. Wewnątrz klasy wewnętrznej ViewHolder pobierz odwołania do elementów View układu elementu listy, z którymi trzeba pracować. Robi się to w konstruktorze ViewHolder, który przyjmuje View.

  6. W metodzie onBindViewHolder użyj position, aby uzyskać odpowiedni element danych z kolekcji. Następnie ustaw wartości właściwości elementów View w holder na podstawie danych tego elementu.

  7. Dodaj metody do aktualizacji danych w adapterze (np. setData(newData: List<Item>) lub addItem(item: Item)). Po zmianie danych konieczne jest wywołanie metod informujących RecyclerView o zmianach, np. notifyDataSetChanged() lub bardziej specyficznych notifyItemInserted(), notifyItemRemoved(), notifyItemChanged(), notifyItemRangeChanged().

Przykład struktury:

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

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

        init {
            // Zdefiniuj słuchacza kliknięcia dla widoku ViewHolder.
            textView = view.findViewById(R.id.textView) // Przykładowe ID z układu
        }
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.item_layout, viewGroup, false) // Przykładowe ID układu elementu
        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() // Lub bardziej precyzyjne notify*
    }
}
  1. W aktywności lub fragmencie, gdzie używany jest RecyclerView, utwórz instancję tego adaptera i ustaw go na RecyclerView za pomocą metody setAdapter(). Nie zapomnij również ustawić LayoutManager dla RecyclerView (np. LinearLayoutManager).
// W Activity/Fragment
val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // Przykładowe ID
val layoutManager = LinearLayoutManager(this) // Lub inny layout manager
recyclerView.layoutManager = layoutManager
val myAdapter = MyAdapter(initialData)
recyclerView.adapter = myAdapter

// Aktualizacja danych
myAdapter.updateData(newData)