使用列表和分页功能延迟加载数据

借助延迟加载和 Paging,您可以通过逐步加载和显示数据,在应用中支持包含大量列表项的列表(包括无限列表)。此技术可让您缩短初始加载时间并优化内存用量,从而提升性能。

结果

以下视频展示了大型列表在用户滚动时提取数据的行为。

版本兼容性

此实现要求将项目的 minSDK 设置为 API 级别 21 或更高级别。

依赖项

显示分页内容

借助 Paging 库,您可以加载和显示来自本地存储或网络中更大的数据集中的数据页面。使用以下代码显示分页列表,其中包含一个进度条,用于向用户指示正在提取更多数据:

@Composable
fun MessageList(
    modifier: Modifier,
    pager: Pager<Int, Message>
) {
    val lazyPagingItems = pager.flow.collectAsLazyPagingItems()

    LazyColumn {
        items(
            lazyPagingItems.itemCount,
            key = lazyPagingItems.itemKey { it.id }
        ) { index ->
            val message = lazyPagingItems[index]
            if (message != null) {
                MessageRow(message)
            } else {
                MessagePlaceholder()
            }
        }
    }
    @Composable
    fun MessagePlaceholder(modifier: Modifier) {
        Box(
            Modifier
                .fillMaxWidth()
                .height(48.dp)
        ) {
            CircularProgressIndicator()
        }
    }

    @Composable
    fun MessageRow(
        modifier: Modifier,
        message: Message
    ) {
        Card(modifier = Modifier.padding(8.dp)) {
            Column(
                modifier = Modifier.padding(8.dp),
                verticalArrangement = Arrangement.Center
            ) {
                Text(message.sender)
                Text(message.text)
            }
        }
    }
}

代码要点

  • LazyColumn:此可组合项用于高效显示大型列表(消息)。它只会渲染屏幕上可见的项,从而节省资源和内存。
  • lazyPagingItems 对象可高效管理 LazyColumn 中分页数据的加载和呈现。它会将 LazyPagingItems 传递给 LazyColumn 可组合项中的 items。
  • MessageRow(message: Text) 负责呈现各个消息项,可能会在卡片中显示消息的发件人和文本。
  • MessagePlaceholder() 会在提取实际消息数据时提供一个视觉占位符(加载旋转图标),从而提升用户体验。

包含此指南的合集

本指南属于精选快速指南集合,这些集合涵盖了更广泛的 Android 开发目标:

列表和网格可让您的应用以赏心悦目的形式显示集合,方便用户浏览。
了解可组合函数如何让您能够轻松创建基于 Material Design 设计系统的精美界面组件。
本系列视频介绍了各种 Compose API,可让您快速了解可用的 API 及其使用方法。

有疑问或反馈

前往我们的常见问题解答页面,了解有关快速指南的信息;或者联系我们并告知您的想法。