RecyclerView – это компонент View, который позволяет эффективно отображать большие наборы данных. Вместо того чтобы создавать представления для каждого элемента в наборе данных, RecyclerView повышает производительность приложения, сохраняя небольшой пул представлений и перерабатывая их по мере прокрутки этих элементов.
В Compose для этого можно использовать ленивые списки. На этой странице описано, как перенести реализацию RecyclerView для использования ленивых списков в Compose.
Этапы переноса
Чтобы перенести реализацию RecyclerView в Compose, выполните следующие действия:
Закомментируйте или удалите
RecyclerViewиз иерархии пользовательского интерфейса и добавьте вместо негоComposeView, если его ещё нет в иерархии. Это контейнер для ленивого списка, который вы добавите:<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <androidx.recyclerview.widget.RecyclerView--> <!-- android:id="@+id/recycler_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent />"--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>Определите, какой тип composable-функции Lazy list вам нужен, исходя из менеджера макетов
RecyclerView(см. таблицу ниже). Выбранная composable-функция будет функцией верхнего уровня дляComposeView, добавленного на предыдущем шаге.LayoutManagerComposable
LinearLayoutManagerLazyColumnилиLazyRowGridLayoutManagerLazyVerticalGridилиLazyHorizontalGridStaggeredGridLayoutManagerLazyVerticalStaggeredGridилиLazyHorizontalStaggeredGrid// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
Создайте соответствующую composable-функцию для каждого типа представления в реализации
RecyclerView.Adapter. Каждый тип представления обычно сопоставляется с подклассомViewHolder, хотя это не всегда так. Эти composable-функции будут использоваться в качестве представления пользовательского интерфейса для различных типов элементов в вашем списке:@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
Логика в методах
onCreateViewHolder()иonBindViewHolder()вашегоRecyclerView.Adapterбудет заменена этими composable-функциями и состоянием, которое вы им предоставляете. В Compose нет разделения между созданием composable-функции для элемента и привязкой к нему данных – эти концепции объединены.В слоте
contentленивого списка (завершающий лямбда-параметр) используйте функциюitems()(или эквивалентную перегрузку), чтобы выполнить итерацию по данным для списка. В лямбда-выраженииitemContentвызовите подходящую composable-функцию для своих данных:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Примеры использования
Оформление элементов
В RecyclerView есть понятие ItemDecoration, которое можно использовать, чтобы добавить специальный рисунок для элементов в списке. Например, вы можете добавить ItemDecoration, чтобы добавить разделители между элементами:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
В Compose нет эквивалентной концепции оформления элементов. Вместо этого вы можете добавить любые декоративные элементы пользовательского интерфейса в список непосредственно в композиции. Например, чтобы добавить разделители в список, можно использовать composable-функцию Divider после каждого элемента:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Анимация объектов
Для RecyclerView можно задать ItemAnimator, чтобы анимировать появление элементов при изменении адаптера. По умолчанию RecyclerView использует DefaultItemAnimator, который обеспечивает базовую анимацию при удалении, добавлении и перемещении событий.
В ленивых списках есть похожая концепция, которая реализуется с помощью модификатора animateItemPlacement.
Подробнее об анимации объектов…
Дополнительные ресурсы
Дополнительную информацию о переносе RecyclerView в Compose можно найти в следующих ресурсах:
- Списки и сетки. Документация по реализации списков и сеток в Compose.
- Совместимость Jetpack Compose: использование Compose в RecyclerView – запись в блоге об эффективном использовании Compose в
RecyclerView.
Рекомендуем
- Примечание. Текст ссылки показывается, когда JavaScript отключен.
- Списки и сетки
- Переход с
CoordinatorLayoutна Compose - Другие причины