Skip to content

RecyclerView

UnitBean edited this page Sep 1, 2018 · 4 revisions

RecyclerView - это современная реализация списка в Android.

Основная концепция этого виджета - это переиспользование ViewHolder'ов для экономии памяти устройства (ListView держит в памяти все свои элементы, в т.ч. и их представления). Для реализации этого переиспользования необходимо создать адаптер для RecyclerView, наследующий RecyclerView.Adapter<T>. В теле адаптера нас интересуют 3 метода, обязательных к переопределению:

  1. onCreateView - он создает ViewHolder'ы нужного типа, "раздувая" нужные разметки и передавая вновь созданную View в конструктор ViewHolder
  2. onBindViewHolder - этот метод вызывается, когда необходимо "привязать" ViewHolder к данным на конкретной позиции
  3. getItemCount - этот метод возвращает количество ячеек, которое будет содержать визуально RecyclerView

Для определения типа ячейки, которую нужно создать, есть также метод: getItemViewType, возвращающий целочисленное значение, на которое можно ориентироваться в методе onCreateView

Данный подход предоставляет широкий набор возможностей работы со списком, как то:

  1. Создание элементов разных типов в одном списке
  2. Обновление данных, как полное (notifyDataSetChanged()), так и частичное, с поддержкой анимации обновления
  3. Перемещение карточек на другую позицию списка
  4. Смахивание карточек жестом с соответствующем Callback'ом
  5. Поддержка кастомных Payload'ов для частичной смены данных в карточке
  6. Работа с вложенными и дочерними списками. Работа с CoordinatorLayout из коробки

Нажатия на элементы ViewHolder'а обрабатываются также, как и на обычные View, но в теле каждого OnClickListener'а содержится вызов слушателя, который мы определяем в базовом классе, и который все клики доставляет туда, где мы его реализуем. В основном, это главные разметки, в которых располагается RecyclerView - Fragment, Activity


Для полноценной работы нужны три объекта:

  1. Экземпляр RecyclerView в разметке
  2. Установленный LayoutManager (можно определить через разметку RecyclerView с помощью атрибута app:layout_manager)
  3. Установленный адаптер

Пример явной установки:

val recyclerView = findViewById<RecyclerView>(R.id.rv_items)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = CustomRecyclerAdapter()

LayoutManager отвечает за расположение и перемещение ячеек в RecyclerView. Есть стандартные реализации:

  1. LinearLayoutManager - линейное отображение, друг за другом. Можно поменять ориентацию, чтобы начало списка было вверху или внизу
  2. GridLayoutManager - отображение в виде плитки, но с равными размерами
  3. StaggeredGridLayoutManager - отображение в виду плитки, размеры ячеек могут быть неравными

Дополнительные материалы:

Clone this wiki locally