Настройка динамического списка   Часть Android Jetpack.

Попробуйте Compose
Jetpack Compose – это рекомендуемый набор инструментов для создания пользовательского интерфейса в Android. Узнайте, как работать с макетами в Compose.

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

Изменение макета

RecyclerView использует менеджер макетов для размещения отдельных элементов на экране и определения того, когда следует повторно использовать представления элементов, которые больше не видны пользователю. Чтобы повторно использовать или переработать представление, менеджер макета может попросить адаптер заменить содержимое представления другим элементом из набора данных. Повторное использование представлений таким образом повышает производительность, поскольку позволяет избежать создания ненужных представлений или выполнения ресурсоемких операций поиска findViewById(). Библиотека поддержки Android включает три стандартных менеджера макетов, каждый из которых предлагает множество вариантов настройки:

  • LinearLayoutManager: располагает элементы в одномерном списке. Использование RecyclerView с LinearLayoutManager обеспечивает функциональность, аналогичную макету ListView.
  • GridLayoutManager – элементы располагаются в виде сетки, как клетки на шахматной доске. Использование RecyclerView с GridLayoutManager обеспечивает функциональность, аналогичную макету GridView.
  • StaggeredGridLayoutManager – элементы располагаются в виде двумерной сетки, в которой каждый столбец немного смещен относительно предыдущего, как звезды на американском флаге.

Если эти менеджеры макетов вам не подходят, вы можете создать собственный, расширив абстрактный класс RecyclerView.LayoutManager.

Добавьте анимацию объектов

При изменении элемента RecyclerView использует аниматор, чтобы изменить его внешний вид. Этот аниматор представляет собой объект, расширяющий абстрактный класс RecyclerView.ItemAnimator. По умолчанию RecyclerView использует DefaultItemAnimator для анимации. Если вы хотите использовать собственные анимации, вы можете определить собственный объект аниматора, расширив RecyclerView.ItemAnimator.

Включить выбор элементов списка

Библиотека recyclerview-selection позволяет пользователям выбирать элементы в списке RecyclerView с помощью сенсорного ввода или мыши. Это позволяет вам контролировать визуальное представление выбранного элемента. Вы также можете управлять правилами, определяющими поведение при выборе, например какие элементы можно выбрать и сколько элементов можно выбрать.

Чтобы добавить поддержку выбора в экземпляр RecyclerView, выполните следующие действия:

  1. Определите, какой тип ключа выбора использовать, а затем создайте ItemKeyProvider.

    Для идентификации выбранных элементов можно использовать три типа ключей:

    Подробную информацию о типах ключей выбора можно найти в статье SelectionTracker.Builder.

  2. Реализуйте ItemDetailsLookup.
  3. ItemDetailsLookup позволяет библиотеке выбора получать доступ к информации об элементах RecyclerView, заданных MotionEvent. По сути, это фабрика для экземпляров ItemDetails, которые поддерживаются экземпляром RecyclerView.ViewHolder или извлекаются из него.

  4. Обновите объекты View в RecyclerView, чтобы отразить, выбрал ли их пользователь.

    Библиотека выбора не предоставляет визуальное оформление по умолчанию для выбранных элементов. Укажите его при реализации onBindViewHolder(). Мы рекомендуем следующий подход:

    • В onBindViewHolder() вызовите setActivated() (не setSelected()) для объекта View с true или false в зависимости от того, выбран ли элемент.
    • Обновите стиль представления, чтобы показать, что оно активировано. Для настройки стиля рекомендуем использовать ресурс списка состояний цвета.
  5. Используйте ActionMode, чтобы предоставить пользователю инструменты для выполнения действия с выбранным объектом.
  6. Зарегистрируйте SelectionTracker.SelectionObserver, чтобы получать уведомления об изменении выбора. При создании выделения запустите ActionMode, чтобы показать его пользователю и предоставить действия, связанные с выделением. Например, вы можете добавить на панель ActionMode кнопку удаления и связать стрелку назад на панели с отменой выбора. Когда выбор становится пустым (если пользователь очищает выбор в последний раз), завершите режим действий.

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

  9. Соберите все вместе с помощью SelectionTracker.Builder.
  10. Ниже показано, как объединить эти элементы.

    Kotlin

        var tracker = SelectionTracker.Builder(
            "my-selection-id",
            recyclerView,
            StableIdKeyProvider(recyclerView),
            MyDetailsLookup(recyclerView),
            StorageStrategy.createLongStorage())
                .withOnItemActivatedListener(myItemActivatedListener)
                .build()
        

    Java

        SelectionTracker tracker = new SelectionTracker.Builder<>(
                "my-selection-id",
                recyclerView,
                new StableIdKeyProvider(recyclerView),
                new MyDetailsLookup(recyclerView),
                StorageStrategy.createLongStorage())
                .withOnItemActivatedListener(myItemActivatedListener)
                .build();
        

    Чтобы создать экземпляр SelectionTracker, ваше приложение должно передать в SelectionTracker.Builder тот же объект RecyclerView.Adapter, который вы используете для инициализации RecyclerView. Поэтому после создания экземпляра SelectionTracker внедрите его в RecyclerView.Adapter. В противном случае вы не сможете проверить статус выбора элемента с помощью метода onBindViewHolder().

  11. Включите выбор в события жизненного цикла объекта activity.
  12. Чтобы сохранить состояние выбора в событиях жизненного цикла объекта activity, приложение должно вызвать методы onSaveInstanceState() и onRestoreInstanceState() трекера выбора из методов onSaveInstanceState() и onRestoreInstanceState() объекта activity соответственно. Приложение также должно передавать конструктору SelectionTracker.Builder уникальный идентификатор выбора. Этот идентификатор необходим, поскольку у действия или фрагмента может быть несколько отдельных списков, которые нужно сохранить.

Дополнительные ресурсы

Дополнительную информацию можно найти в следующих источниках: