You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:06:02