Назад к вопросам
Junior
84
questionbank

В чем суть паттерна ViewHolder?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

ViewHolder — это вспомогательный класс в Android, предназначенный для кэширования ссылок на View-элементы innerhalb адаптера.

Суть паттерна:

  1. Кэширование: Вместо того чтобы каждый раз вызывать findViewById() при создании или переиспользовании элемента списка, ViewHolder единожды находит ссылки на View и хранит их.
  2. Переиспользование: При прокрутке списка Android переиспользует уже созданные View-объекты для экономии памяти и ресурсов. ViewHolder, привязанный к такому View, предоставляет быстрый доступ к его дочерним элементам.
  3. Производительность: Уменьшает количество вызовов findViewById(), что значительно ускоряет отрисовку списков (например, в RecyclerView, ListView).

Пример использования в RecyclerView.Adapter:

class MyAdapter(...) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val textView: TextView = itemView.findViewById(R.id.my_text_view)
        val imageView: ImageView = itemView.findViewById(R.id.my_image_view)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.list_item_layout, parent, false)
        return MyViewHolder(view) // Создаем ViewHolder один раз
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        // Используем кэшированные ссылки для обновления данных
        holder.textView.text = "Item ${position}"
        // holder.imageView.setImage...
    }

    // ... other methods
}