Представляем новый MergeAdapter для разработчиков Android

Вступление

MergeAdapter - это новая функция, представленная в recyclerview:1.2.0-alpha02, позволяющая последовательно объединять несколько адаптеров. Это обеспечивает большую инкапсуляцию и возможность повторного использования вместо объединения нескольких источников данных в один и тот же адаптер. В этой статье вы узнаете, как использовать MergeAdapter и некоторые другие полезные вещи, например, как эффективно использовать пул представлений для разных адаптеров.

Интеграция

Команда Android выпустила новую версию recyclerview. Чтобы использовать MergeAdapter, обновите версию библиотеки recyclerview до 1.2.0-alpha02 или включите следующую строку под тегом зависимостей в build.gradle файле уровня приложения:

dependencies {
   implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha02'
}

Работа с MergeAdapter

Давайте рассмотрим базовый вариант использования. Нам нужно показать макет заголовка, затем список тем и нижний колонтитул, показывающий загрузку или ошибку. У нас есть три разных адаптера, по одному для каждого типа - HeaderAdapter, TopicAdapter и FooterAdapter.

Мы хотим объединить эти три адаптера с помощью конструктора слияния-адаптера и установить для экземпляра результата MergeAdapter значение recyclerview. Во-первых, нужно объединить три адаптера, как показано на рисунке:

val headerAdapter: HeaderAdapter= …
val topicAdapter: TopicAdapter= …
val footerAdapter: FooterAdapter= …
val mergeAdapter = MergeAdapter(headerAdapter, topicAdapter, 
     footerAdapter)

Представления в recyclerview будут отображаться в соответствии с порядком адаптеров в конструкторе MergeAdapter. После этого, как обычно, нам нужно вызвать setAdapter и передатьmergeAdapter`instance, как показано ниже:

recyclerView.adapter = mergeAdapter

Таким образом достигается разделение проблем:

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

Изучение MergeAdapter

MergeAdapter.Config

По умолчанию каждый адаптер использует свой собственный пул из viewHolders. Если у вас один и тот же макет, который нужно использовать для разных адаптеров, вы должны использовать MergeAdapter.Config. Мы можем настроить слияние-адаптер на три разных типа:

  • MergeAdapter.Config.StableIdMode.NO_STABLE_IDS - это режим по умолчанию. Каждый адаптер имеет свой собственный пул viewholder и игнорирует стабильные идентификаторы от субадаптеров.
  • MergeAdapter.Config.StableIdMode.ISOLATED_STABLE_IDS - в этом режиме MergeAdapter собирает все идентификаторы от субадаптеров, поскольку два разных viewHolder могут возвращать один и тот же идентификатор, потому что они не знают друг друга. Затем MergeAdapter изолирует каждый пул идентификаторов _37 _ друг от друга, заставляя их перезаписывать зарегистрированный стабильный идентификатор перед отправкой обратно в RecyclerView.
  • MergeAdapter.Config.StableIdMode.SHARED_STABLE_IDS - в этом режиме MergeAdapter не изолирует пулы каждого адаптера друг от друга, а также не переопределяет идентификаторы, как это было в предыдущем случае.

Обновление данных и ViewHolders

Я бы рекомендовал использовать ListAdapter, который обрабатывает изменения данных вместо общего recyclerview.adapter. Следующее - viewholder. Чтобы получить положение адаптера в recyclerview, мы используем ViewHolder.getAdapterPosition, но когда вы работаете через адаптер Merge, вам нужно использовать ViewHolder.getBindingAdapter().

Заключение

Поскольку он все еще находится на ранней стадии разработки, я бы не рекомендовал вам использовать эту функцию в производственном коде. В будущем могут быть изменения, или некоторые функции могут быть удалены в следующих версиях.

Я также рекомендую использовать функцию типов представлений из Recyclerview.Adapter для отображения различных представлений в recyclerview. Используйте MergeAdapter только тогда, когда он извлекает выгоду из инкапсуляции. MergeAdapter не позволяет отображать разные типы представлений; это способ обеспечения инкапсуляции при расширении различных типов представления.

Бонус

Чтобы узнать больше об адаптерах в Android, прочтите следующие статьи:

Спасибо за чтение.