Класс ViewHolder
В коде пишут наследника
RecyclerView.ViewHolder.
Урок на сайте называется
ViewHolder
и лежит рядом с
Adapter,
хотя в SDK класс вложен в RecyclerView.
Holder держит корневой View пункта
в поле itemView
и ссылки на
TextView
через
findViewById.
Создают в
onCreateViewHolder,
заполняют в
onBindViewHolder.
Синтаксис
class Holder(view: View) : RecyclerView.ViewHolder(view) {
val label: TextView = view.findViewById(R.id.label)
}
Пример
Давайте сохраним TextView в Holder:
import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class LineAdapter : RecyclerView.Adapter<LineAdapter.Holder>() {
class Holder(view: View) : RecyclerView.ViewHolder(view) {
val label: TextView = itemView.findViewById(R.id.label)
}
override fun onCreateViewHolder(
parent: android.view.ViewGroup,
viewType: Int,
): Holder {
throw UnsupportedOperationException()
}
override fun onBindViewHolder(holder: Holder, position: Int) {
holder.label.text = "abcde"
}
override fun getItemCount(): Int = 1
}
На экране один пункт списка покажет "abcde"
через label в Holder.
Пример
Давайте повесим onClick на itemView Holder:
import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class LineAdapter(
private val onRowClick: (Int) -> Unit,
) : RecyclerView.Adapter<LineAdapter.Holder>() {
class Holder(
view: View,
onClick: (Int) -> Unit,
) : RecyclerView.ViewHolder(view) {
val label: TextView = view.findViewById(R.id.label)
init {
view.setOnClickListener {
onClick(bindingAdapterPosition)
}
}
}
override fun onCreateViewHolder(
parent: android.view.ViewGroup,
viewType: Int,
): Holder {
throw UnsupportedOperationException()
}
override fun onBindViewHolder(holder: Holder, position: Int) {
holder.label.text = "12345"
}
override fun getItemCount(): Int = 1
}
На экране нажатие по строке списка вызовет переданный onRowClick с позицией пункта.
Смотрите также
-
класс
Adapter,
который создаёт и биндит ViewHolder -
класс
RecyclerView,
который переиспользует Holder при прокрутке -
метод
findViewById,
которым ищут label внутри itemView -
метод
onCreateViewHolder,
который возвращает новый Holder