Jetpack Compose中Paging3搭配LazyVerticalGrid时如何获取PagingData<T>数据列表
Compose场景下Paging3获取PagingData条目的方案
前置依赖
你需要先引入paging-compose官方扩展库,无需自行实现PagingDataAdapter即可在Compose中使用Paging3能力:
dependencies { implementation "androidx.paging:paging-compose:3.2.1" // 可替换为最新稳定版 }
核心实现步骤
1. 将PagingData流转为Compose可使用的LazyPagingItems
在Composable函数中,通过collectAsLazyPagingItems()扩展方法将ViewModel输出的Flow<PagingData<T>>转为LazyPagingItems<T>实例,该实例持有所有已加载的分页数据:
@Composable fun YourGridScreen(viewModel: YourViewModel = viewModel()) { // 拿到分页数据的可观测实例 val pagingItems = viewModel.yourPagingDataFlow.collectAsLazyPagingItems() // 后续通过pagingItems即可访问所有条目 }
2. 场景1:直接在LazyVerticalGrid中渲染条目
LazyPagingItems支持直接通过索引访问对应位置的条目,无需额外转列表即可直接用于网格渲染:
LazyVerticalGrid(columns = GridCells.Fixed(2)) { items(pagingItems.itemCount) { index -> val item = pagingItems[index] item?.let { // 渲染自定义网格项UI YourGridItem(data = it) } } // 可扩展添加加载更多、加载失败等状态的兜底item when (pagingItems.loadState.append) { is LoadState.Loading -> { item { LoadingFooter() } } is LoadState.Error -> { item { RetryFooter(onRetry = { pagingItems.retry() }) } } else -> {} } }
3. 场景2:主动获取当前已加载的所有条目列表
如果需要拿到当前分页加载完成的全量数据列表,调用LazyPagingItems的itemSnapshotList()方法即可:
// 获取当前已加载数据的不可变快照 val currentLoadedList: List<T?> = pagingItems.itemSnapshotList.items // 如果开启了占位符,列表中会存在null值,过滤即可拿到有效数据 val validDataList = currentLoadedList.filterNotNull()
注意事项
itemSnapshotList是瞬时快照,后续分页加载到新数据后,之前拿到的快照不会自动更新,需要重新调用方法获取最新列表- 如果未开启占位符配置,返回的快照列表不会包含null值,直接就是所有已加载的有效数据
- 不要直接修改
LazyPagingItems内部的数据,所有修改操作应该基于快照列表进行
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

