RecyclerView - важный виджет в платформе Android, и большая часть приложений Android использует его. Это мощный инструмент, охватывающий множество общих вариантов использования. Однако из-за такой гибкости необходимо немного поработать для создания адаптера.

Поддержка нескольких типов представлений была одним из преимуществ RecyclerView перед устаревшим списком. Но для отображения нескольких типов представления требуется много шаблонного кода. Это может быстро выйти из-под контроля, если у вас более трех типов просмотра. У вас может быть несколько условий if-else, переключаться между регистрами и т. Д. К сожалению, нет простого способа повторно использовать код создания и привязки держателей просмотра.

MultiViewAdapter предназначен для решения именно этой проблемы. Уже существует ряд решений, но у таких библиотек есть несколько ограничений:

  1. У ваших объектов данных должен быть общий родительский элемент, который может мешать моделированию вашего объекта.
  2. Вы вынуждены хранить идентификатор ресурса макета внутри самого класса модели. Опять же, это нарушает иерархию зависимостей.
  3. Вы можете самостоятельно управлять идентификатором типа представления. Обычно идентификатор ресурса макета возвращается как тип представления. Таким образом, вы не можете использовать один и тот же файл макета для двух разных типов представления.
  4. Они не используют DiffUtil.
  5. Вам нужно написать случаи переключения, если вы хотите иметь разные элементы-декорации / размер диапазона / режимы выбора для разных типов представления.

MultiViewAdapter решает все эти требования. Библиотека была специально разработана таким образом, чтобы не мешать моделированию и иерархии объектов.

Исходный код



Вот краткий обзор того, чего можно достичь с помощью библиотеки.

Функции

  1. Никаких ограничений на то, как вы моделируете свои классы объектов и их иерархию.
  2. Готовая поддержка DiffUtil.
  3. Поддерживает одиночный выбор и множественный выбор.
  4. Каждый тип представления, помимо прочего, может иметь собственное количество диапазонов или ItemDecoration. Вам не нужно менять регистр или условие «если-еще».

Как это использовать

Добавьте зависимость в файл Gradle вашего приложения.

Концепции, лежащие в основе MultiViewAdapter

  1. RecyclerAdapter - это класс адаптера. У него может быть несколько ItemBinder и DataManager. Он расширяется от официального RecyclerView.Adapter
  2. ItemBinder. ItemBinder отвечает за создание и привязку держателей просмотра. ItemBinder имеет параметр типа, который принимает класс модели, который необходимо отобразить. ItemBinder необходимо зарегистрировать внутри RecyclerAdapter. ItemBinder можно зарегистрировать с несколькими адаптерами.
  3. DataManger - хранит данные и вызывает необходимые анимации при изменении набора данных. Есть два DataManager. DataListManager для просмотра списка элементов. DataItemManager для отдельного элемента (заголовок, нижний колонтитул и т. д.).

Создание простых переходников

У вас есть список объектов, скажем «Машины». Если вы хотите отобразить список автомобилей, вот весь код.

Теперь можно идти. Вы можете использовать адаптер CarAdapter carAdapter = new CarAdapter(); и установить его на recyclerview. Вот и все.

Вы могли заметить, что при традиционном подходе мы всегда создаем один класс CarAdapter. Но при использовании библиотеки нужно создать два класса - CarAdapter и CarBinder. Идея здесь в том, что вы можете повторно использовать CarBinder и в других адаптерах, например, VehicleAdapter.

Использование GridLayoutManager

При отображении сетки элементов вам не нужны разные адаптеры. Вы можете переопределить getSpanSize(int maxSpanCount) внутри своего класса ItemBinder и вернуть счетчик диапазона.

Теперь получите от адаптера поиск spansize и установите его в свой GridLayoutManager.

Для разного количества пролетов

Здесь не о чем беспокоиться. По умолчанию каждое связыватель элементов возвращает 1 в качестве счетчика диапазона. Поэтому, если вам нужно другое количество диапазонов, отличное от значения по умолчанию, вы можете переопределить метод getSpanSize и вернуть необходимое количество диапазонов.

Индивидуальное оформление предметов

Это сложная часть. Еще сложнее, когда вы не используете эту библиотеку. Есть три шага для создания декораций для каждого типа представления.

  1. Создайте собственный класс оформления предметов, расширяющий ItemDecorator.

2. При создании ItemBinder передайте объект декоратора настраиваемого элемента через конструктор.

3. Теперь возьмите украшение предмета из адаптера и добавьте его в ваш recyclerview.

Достаточно сложного. Уф.

DiffUtil и пользовательские данные

MultiViewAdapter по умолчанию заботится о DiffUtil. Если вы хотите передать полезные данные во время операции diffutil, вам необходимо передать объект PayloadProvider через конструктор. Чтобы узнать больше о diffutil, прочтите здесь.

Возможность выбора адаптера

MultiViewAdapter поддерживает три различных варианта выбора:

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

Чтобы сделать адаптер выбираемым, вам необходимо использовать «выбираемые» аналоги Adaptor, ItemBinder и ViewHolder. Например, вы можете использовать SelectableAdapter, SelectableBinder и SelectableViewHolder.

Давайте возьмем пример CarAdapter и сделаем его доступным для выбора.

Примечания :

  1. Необязательно, чтобы можно было выбирать все привязки предметов. Например, если у вас есть заголовки в списке, его нельзя выбрать. Итак, расширите HeaderBinder от обычного ItemBinder.
  2. Вы можете повторно использовать любое выбираемое связующее внутри обычного адаптера. Его нельзя будет выбрать. Чтобы элемент можно было выбрать, и адаптер, и подшивка должны быть расширены от их выбираемых аналогов.
  3. По умолчанию при долгом нажатии будет выбран элемент. Если вы хотите, чтобы элемент был выбран, вы можете вызвать itemSelectionToggled() внутри ViewHolder.
  4. Вы можете установить или получить выбранные элементы из DataListManager, используя getSelectedItems() и setSelectedItems(List<E> items)

Слушатели

ViewHolders имеет два слушателя: OnItemClickListener и OnItemLongClickListener.

DataListManager имеет ItemSelectionChangedListener и MultiSelectionChangedListener. Эти слушатели можно использовать с SelectableAdapter.

Заключительные примечания

Спасибо за чтение! Надеюсь, эта статья поможет вам начать работу с библиотекой MultiViewAdapter. Сама библиотека находится в стадии активной разработки, и я планирую добавить несколько интересных функций. Вы можете смотреть репозиторий в GitHub, чтобы получать уведомления. Также вы можете ознакомиться с планом развития библиотеки на GitHub.

Если у вас есть какие-либо вопросы, проблемы или пожелания относительно библиотеки, вы можете связаться со мной через Twitter.

Чтобы помочь другим, нажмите ❤, чтобы порекомендовать эту статью, и пометьте библиотеку, если вы нашли ее полезной.

Весь код, представленный в этой статье, и библиотека находятся под лицензией Apache-2.0. Автор Рияз Ахамед с ❤ из Бангалора, Индия.