RecyclerView — это компонент View, который позволяет эффективно отображать большие наборы данных. Вместо создания представлений для каждого элемента в наборе данных, RecyclerView повышает производительность вашего приложения, поддерживая небольшой пул представлений и повторно используя их по мере прокрутки элементов.
В Compose вы можете использовать ленивые списки для достижения того же результата. На этой странице описано, как перевести вашу реализацию RecyclerView на использование ленивых списков в Compose.
Этапы миграции
Для переноса вашей реализации RecyclerView в Compose выполните следующие шаги:
Закомментируйте или удалите
RecyclerViewиз иерархии пользовательского интерфейса и добавьтеComposeViewна его место, если его еще нет в иерархии. Это контейнер для списка Lazy, который вы добавите:<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>Определите, какой тип составного элемента «Ленивый список» вам нужен, исходя из менеджера компоновки вашего
RecyclerView(см. таблицу ниже). Выбранный вами составной элемент будет составным элементом верхнего уровня дляComposeView, добавленного на предыдущем шаге.LayoutManagerКомпозируемый
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 } }
Создайте соответствующий компонуемый объект для каждого типа представления в вашей реализации
RecyclerView.Adapter. Каждый тип представления обычно соответствует подклассуViewHolder, хотя это может быть не всегда так. Эти компонуемые объекты будут использоваться в качестве представления пользовательского интерфейса для различных типов элементов в вашем списке:@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будет заменена этими компонуемыми объектами и состоянием, которое вы им предоставите. В Compose нет разделения между созданием компонуемого объекта для элемента и привязкой данных к нему — эти концепции объединены.Внутри слота
contentленивого списка (завершающий параметр лямбда-функции) используйте функциюitems()(или эквивалентную перегрузку) для итерации по данным вашего списка. В лямбда-itemContentвызовите соответствующий составной элемент для ваших данных: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 нет аналогичного понятия для оформления элементов. Вместо этого вы можете добавлять любые элементы оформления из списка непосредственно в композицию. Например, чтобы добавить разделители в список, вы можете использовать компонент 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 - Другие соображения