Paging 库概览   Android Jetpack 的一部分。

Paging 库可帮助您加载和显示来自本地存储或网络中更大的数据集中的数据页面。此方法可让您的应用更高效地利用网络带宽和系统资源。Paging 库的组件旨在契合推荐的 Android 应用架构,流畅集成其他 Jetpack 组件,并提供一流的 Kotlin 支持。

使用 Paging 库的优势

Paging 库包含以下功能:

  • 分页数据的内存中缓存。该功能有助于确保您的应用在处理分页数据时高效使用系统资源。
  • 内置的请求去重功能,可确保您的应用高效利用网络带宽和系统资源。
  • 为 Kotlin 协程和流程提供一流的支持。
  • 内置对错误处理功能的支持,包括刷新和重试功能。

设置

如需将 Paging 组件导入到 Android 应用中,请将以下依赖项添加到应用的 build.gradle 文件中:

Kotlin

dependencies {
  val paging_version = "3.4.2"

  implementation("androidx.paging:paging-common:$paging_version")

  // Jetpack Compose integration
  implementation("androidx.paging:paging-compose:$paging_version")
}

Groovy

dependencies {
  def paging_version = "3.4.2"

  implementation "androidx.paging:paging-common:$paging_version"

  // Jetpack Compose integration
  implementation "androidx.paging:paging-compose:$paging_version"
}

库架构

Paging 库的组件在应用的三个层运行:

  • 代码库层
  • ViewModel
  • 界面层
图片显示分页数据从代码库层中的 PagingSource 或 RemoteMediator 组件流向 ViewModel 层中的 Pager 组件。
    然后,Pager 组件将 PagingData 流公开给界面层中的延迟布局组件。
图 1. 说明 Paging 库如何契合应用架构的示例。

本部分介绍了在每个层运行的 Paging 库组件以及它们如何协作加载和显示分页数据。

代码库层

代码库层中的主要 Paging 库组件是 PagingSource。每个 PagingSource 对象都定义了数据源,以及如何从该数据源检索数据。PagingSource 对象可以从任何单个数据源(包括网络来源和本地数据库)加载数据。

您可能使用的另一个 Paging 库组件是 RemoteMediatorRemoteMediator 对象会处理来自分层数据源(例如具有本地数据库缓存的网络数据源)的分页。

ViewModel 层

Pager 组件提供了一个公共 API,基于 PagingSource 对象和 PagingConfig 配置对象来构造在响应式流中公开的 PagingData 实例。

ViewModel 层连接到界面的组件是 PagingDataPagingData 对象是用于存放分页数据快照的容器。它会查询 PagingSource 对象并存储结果。

界面层

主要的 Paging 界面 API 是 collectAsLazyPagingItems()。它将分页项公开为可供 Compose 的延迟布局组件(如 LazyColumnLazyRow)轻松使用的数据列表。

添加 androidx.paging:paging-compose 库,以使用与 Compose 兼容的 API,这些 API 可让界面自动响应数据加载、更新和错误,而无需适配器或差分逻辑。在 Flow<PagingData> 上使用 collectAsLazyPagingItems() 扩展函数,以在 LazyColumn 中将返回的 LazyPagingItems 传递给 items()

@Composable
fun MessageList(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()
            }
        }
    }
}

如需了解详情,请参阅大型数据集(分页)