RecyclerView 是一种视图组件,可让您轻松高效地显示大量数据。RecyclerView 不会为数据集中的每个项都创建视图,而是通过保留少量视图并在您滚动浏览这些项时循环使用这些视图来提高应用的性能。
在 Compose 中,您可以使用延迟列表来实现相同的效果。本页面介绍了如何迁移 RecyclerView 实现以在 Compose 中使用 LazyList。
迁移步骤
如需将 RecyclerView 实现迁移到 Compose,请按以下步骤操作:
从界面层次结构中注释掉或移除
RecyclerView,并添加ComposeView来替换它(如果层次结构中尚无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的布局管理器(见下表)确定所需的 LazyListComposables 类型。您选择的可组合项将成为您在上一步中添加的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` } }
RecyclerView.Adapter的onCreateViewHolder()和onBindViewHolder()方法中的逻辑将替换为这些可组合项以及您提供给它们的状态。在 Compose 中,为项创建可组合项与将数据绑定到可组合项之间没有分离,这两个概念是合并的。在 Lazy 列表的
contentslot(尾随 lambda 形参)内,使用items()函数(或等效的重载)遍历列表的数据。在itemContentlambda 中,为您的数据调用适当的可组合项: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 互操作性:在 RecyclerView 中使用 Compose:这篇博文介绍了如何在
RecyclerView中高效使用 Compose。
为您推荐
- 注意:当 JavaScript 处于关闭状态时,系统会显示链接文字
- 列表和网格
- 将
CoordinatorLayout迁移到 Compose - 其他注意事项