Как да създадете собствен RecyclerView.Adapter за използване в Android приложение?
sobes.tech AI
Отговор от AI
-
Създайте клас, наследяващ
RecyclerView.Adapter<ViewHolder>. КъдетоViewHolderе вътрешен клас, наследяващRecyclerView.ViewHolder. -
Реализирайте три абстрактни метода:
onCreateViewHolder(parent: ViewGroup, viewType: Int): Създава нов екземпляр наViewHolder. Обикновено тук се извършва inflate на макета на елемента от списъка.onBindViewHolder(holder: ViewHolder, position: Int): Свързва данните с елементите отViewHolderза дадената позиция.getItemCount(): Int: Връща общия брой елементи в набора от данни.
-
Вътре в класа на адаптера определете списък или друг контейнер за съхранение на данните, които ще се показват.
-
В метода
onCreateViewHolderполучетеLayoutInflaterот контекста наparent, след което извикайтеinflater.inflate()за създаване на View елемент на списъка. Предайте създадения View към конструктора наViewHolder. -
Вътре във вътрешния клас
ViewHolderполучете референции към View елементите на макета на елемента от списъка, с които трябва да работите. Това става в конструктора наViewHolder, който получава View. -
В метода
onBindViewHolderизползвайтеpositionза получаване на съответния елемент от данните от колекцията. След това задайте стойностите на свойствата на View елементите вholderвъз основа на данните от този елемент. -
Добавете методи за актуализиране на данните в адаптера (например,
setData(newData: List<Item>)илиaddItem(item: Item)). След промяна на данните е необходимо да извикате методи, които информиратRecyclerViewза промените, напримерnotifyDataSetChanged()или по-специфичнитеnotifyItemInserted(),notifyItemRemoved(),notifyItemChanged(),notifyItemRangeChanged().
Примерна структура:
class MyAdapter(private var dataSet: List<String>) :
RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val textView: TextView
init {
// Определете слушател за кликване за View на ViewHolder.
textView = view.findViewById(R.id.textView) // Примерен ID от макета
}
}
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.item_layout, viewGroup, false) // Примерен ID на макета
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() // Или по-точните notify*
}
}
- В активността или фрагмента, където се използва
RecyclerView, създайте екземпляр на този адаптер и го задайте наRecyclerViewчрез методаsetAdapter(). Също така не забравяйте да зададетеLayoutManagerзаRecyclerView(например,LinearLayoutManager).
// В Activity/Fragment
val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // Примерен ID
val layoutManager = LinearLayoutManager(this) // Или друг layout manager
recyclerView.layoutManager = layoutManager
val myAdapter = MyAdapter(initialData)
recyclerView.adapter = myAdapter
// Актуализиране на данните
myAdapter.updateData(newData)