Jak stworzyć własny RecyclerView.Adapter do użycia w aplikacji na Androida?
sobes.tech AI
Odpowiedź od AI
-
Utwórz klasę dziedziczącą po
RecyclerView.Adapter<ViewHolder>. GdzieViewHolderto klasa wewnętrzna dziedzicząca poRecyclerView.ViewHolder. -
Zaimplementuj trzy metody abstrakcyjne:
onCreateViewHolder(parent: ViewGroup, viewType: Int): Tworzy nowy egzemplarzViewHolder. Zazwyczaj tutaj wykonywane jest inflowanie układu elementu listy.onBindViewHolder(holder: ViewHolder, position: Int): Wiąże dane z elementamiViewHolderdla wskazanej pozycji.getItemCount(): Int: Zwraca łączną liczbę elementów w zestawie danych.
-
Wewnątrz klasy adaptera zdefiniuj listę lub inny kontener do przechowywania danych, które będą wyświetlane.
-
W metodzie
onCreateViewHolderpobierzLayoutInflaterz kontekstuparent, a następnie wywołajinflater.inflate()w celu utworzenia elementu View listy. Przekaż utworzony View do konstruktoraViewHolder. -
Wewnątrz klasy wewnętrznej
ViewHolderpobierz odwołania do elementów View układu elementu listy, z którymi trzeba pracować. Robi się to w konstruktorzeViewHolder, który przyjmuje View. -
W metodzie
onBindViewHolderużyjposition, aby uzyskać odpowiedni element danych z kolekcji. Następnie ustaw wartości właściwości elementów View wholderna podstawie danych tego elementu. -
Dodaj metody do aktualizacji danych w adapterze (np.
setData(newData: List<Item>)lubaddItem(item: Item)). Po zmianie danych konieczne jest wywołanie metod informującychRecyclerViewo zmianach, np.notifyDataSetChanged()lub bardziej specyficznychnotifyItemInserted(),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*
}
}
- W aktywności lub fragmencie, gdzie używany jest
RecyclerView, utwórz instancję tego adaptera i ustaw go naRecyclerViewza pomocą metodysetAdapter(). Nie zapomnij również ustawićLayoutManagerdlaRecyclerView(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)