Представляем новый 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
. Во-первых, нужно объединить три адаптера, как показано на рисунке:
valheaderAdapter
:HeaderAdapter
= … valtopicAdapter
:TopicAdapter
= … valfooterAdapter
:FooterAdapter
= … val mergeAdapter = MergeAdapter(headerAdapter
,topicAdapter
,footerAdapter
)
Представления в recyclerview
будут отображаться в соответствии с порядком адаптеров в конструкторе MergeAdapter
. После этого, как обычно, нам нужно вызвать setAdapter
и передатьmergeAdapter`
instance, как показано ниже:
recyclerView.adapter = mergeAdapter
Таким образом достигается разделение проблем:
- Чтобы показать загрузку или случай ошибки, теперь мы можем сделать это в
FooterAdapter
- Если у нас разные типы представлений в темах, мы можем сделать это отдельно в
TopicAdapter
.
Изучение MergeAdapter
MergeAdapter.Config
По умолчанию каждый адаптер использует свой собственный пул из viewHolder
s. Если у вас один и тот же макет, который нужно использовать для разных адаптеров, вы должны использовать 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, прочтите следующие статьи:
Спасибо за чтение.