ViewHolder — это оптимизационный паттерн, используемый в Android-разработке для повышения производительности RecyclerView
и ListView
. Его основная цель — минимизировать количество операций findViewById()
, которые являются ресурсоемкими.
class MyAdapter(private val items: List<String>) :
RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(R.id.text_view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_layout, parent, false)
return MyViewHolder(view)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.textView.text = items[position]
}
override fun getItemCount() = items.size
}
onBindViewHolder()
выполнял бы findViewById()
findViewById()
при прокрутке// Расширенный пример с обработкой кликов
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(R.id.text_view)
val imageView: ImageView = itemView.findViewById(R.id.image_view)
init {
itemView.setOnClickListener {
// Обработка клика
}
}
}
override fun getItemViewType(position: Int): Int {
return when {
items[position].isHeader -> TYPE_HEADER
else -> TYPE_ITEM
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
TYPE_HEADER -> HeaderViewHolder(...)
else -> ItemViewHolder(...)
}
}
// ПЛОХОЙ ПРИМЕР
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val textView = holder.itemView.findViewById<TextView>(R.id.text_view)
textView.text = items[position]
}