如何合并两个Paging分页数据流并统一提交给PagingAdapter
解决方案
Paging3 官方提供了PagingData.concat()扩展函数,专门用于按顺序拼接多份 PagingData 实例,完全符合你优先展示unscheduledTasksList、再展示assignedList的需求。
实现说明
- concat 会严格按照传入顺序加载展示:先加载并展示第一份 PagingData 的全部分页内容,全部加载完成后才会触发第二份 PagingData 的分页加载
- 要求两份 PagingData 的泛型类型一致,如果两个接口返回的模型不同,需要先通过
PagingData.map转换为 Adapter 统一识别的模型类型 - 可选搭配
insertHeaderItem为两个列表增加分区标题,方便用户区分两类任务
修改后的完整代码
viewLifecycleOwner.lifecycleScope.launchWhenStarted { val assignedListFlow = async { assignedTaskViewModel.getPagingTasks(getAssignedTasks) } val unscheduledTasksFlow = async { assignedTaskViewModel.getUnscheduledChores(getUnscheduledTasks) } unscheduledTasksFlow.await().combine(assignedListFlow.await()) { unschedulePaging, assignPaging -> Timber.d("combining 2 calls") // 1. 先把两个PagingData转成Adapter统一接收的类型,类型已经一致可跳过这步 val formattedUnschedule = unschedulePaging.map { it as CommonTaskModel } val formattedAssign = assignPaging.map { it as CommonTaskModel } // 2. 可选:给两类任务增加分区头部,不需要可直接删除这部分 val unscheduleWithHeader = formattedUnschedule.insertHeaderItem( item = TaskSectionHeader(title = "待安排任务") ) val assignWithHeader = formattedAssign.insertHeaderItem( item = TaskSectionHeader(title = "已分配任务") ) // 3. 按顺序拼接PagingData,前面的优先展示 return@combine unscheduleWithHeader.concat(assignWithHeader) }.collectLatest { combinedPagingData -> assignedTasksPagingAdapter?.submitData(combinedPagingData) } }
注意事项
- 该 API 为 Paging 3.0.0 及以上版本的稳定 API,确保你的项目依赖版本符合要求
- 如果你的 Adapter 支持多类型布局,直接增加分区头部对应的 ViewHolder 逻辑即可正常渲染,不需要额外修改分页逻辑
- combine 操作符会监听两份 PagingData 的刷新事件,任意一方数据源刷新时都会重新拼接后提交给 Adapter,保证列表数据的实时性
内容的提问来源于stack exchange,提问作者Venkatesh Kashyap
相关产品推荐
相关产品推荐

