有没有办法在Android中使用Paging Library 3.0实现基于光标的分页?

2024-01-09

我正在使用一个 REST API,它使用基于游标的分页来显示一些结果。我想知道我是否可以使用分页库3.0 https://developer.android.com/topic/libraries/architecture/paging/v3-overview对其进行分页。我一直在浏览一些媒体和文档,但似乎找不到实现它的方法。如果你们中的任何人找到了任何解决方案,我将很高兴收到它!

api 响应分页如下所示:

"paging": {
    "previous": false,
    "next": "https://api.acelerala.com/v1/orders/?store_id=4&after=xyz",
    "cursors": {
        "before": false,
        "after": "xyz"
    }
}

感谢@Đặng Anh Hào,我才能够走上正轨。由于我的光标是 String 而不是 Int,因此分页源加载函数如下所示:

override suspend fun load(params: LoadParams<String>): LoadResult<String, Order> {
    return try{
        val response = service.getOrders(query,params.key?:"",10)
        val nextKey = if(response.paging?.cursors?.after=="false") null else response.paging?.cursors?.after
        val prevKey = if(response.paging?.cursors?.before=="false") null else response.paging?.cursors?.before
        LoadResult.Page(response.data?.toOrderList()?:emptyList(),prevKey,nextKey)
    }catch (exception: IOException) {
        LoadResult.Error(exception)
    } catch (exception: retrofit2.HttpException) {
        LoadResult.Error(exception)
    }
}

onrefreshkey 看起来像这样:

override fun getRefreshKey(state: PagingState<String, Order>): String? {
    return state.anchorPosition?.let {
        state.closestItemToPosition(it)?.orderId
    }
}

存储库方法如下所示:

fun getOrdersPaginated(storeId: String): Flow<PagingData<Order>> {
    return Pager(
        config = PagingConfig(enablePlaceholders = false,pageSize = 10),
        pagingSourceFactory = {PagingSource(apiService,storeId)}
    ).flow

}

而View Model方法是这样的:

private val _pagedOrders = MutableLiveData<PagingData<Order>>()
val orders get() = _pagedOrders

private var currentQueryValue: String? = null
private var currentSearchResult: Flow<PagingData<Order>>? = null

fun getOrdersPaginated(storeId: String) {
    viewModelScope.launch {
        currentQueryValue = storeId
        val newResult: Flow<PagingData<Order>> = repository.getOrdersPaginated(storeId)
            .cachedIn(viewModelScope)
        currentSearchResult = newResult
        currentSearchResult!!.collect {
            _pagedOrders.value = it
        }
    }
}

该活动像这样调用分页:

private var searchJob: Job? = null

private fun getOrders() {
    viewModel.getOrdersPaginated(storeId)
}

private fun listenForChanges() {
    viewModel.orders.observe(this, {
        searchJob?.cancel()
        searchJob = lifecycleScope.launch {
            ordersAdapter.submitData(it)
        }
    })
}

最后,适配器与 ListAdapter 相同,唯一的变化是它现在扩展了PagingDataAdapter<Order, OrderAdapter.ViewHolder>(OrdersDiffer)

有关如何操作的更详细教程,我读了这个代码实验室 https://developer.android.com/codelabs/android-paging#0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在Android中使用Paging Library 3.0实现基于光标的分页? 的相关文章

随机推荐

  • 在 Visual Studio Code 中设置“outDir”属性

    当我尝试调试 C 程序时 我继续收到此错误 can t launch program c Users my username Desktop C setting the outDir attribute might help 我尝试了各种语
  • 强制gcc在64位平台上编译32位程序

    我有一个专有程序 正在尝试在 64 位系统上使用 当我启动安装程序时 它工作正常 但是在它尝试更新自身并编译一些模块后 它无法加载它们 我怀疑这是因为它使用 gcc 并且 gcc 尝试为 64 位系统编译它们 因此该程序无法使用这些模块 有
  • 即时将文件上传到 Azure Blob

    我正在尝试创建一个文件并将其放入 blob 中CloudBlockBlob UploadFromStreamAsync method 这是代码 private async void CreateCsvFile int recId using
  • Android OnLayout何时调用?

    我开发一个自定义View它延伸自ViewGroup 这意味着我需要实施onLayout方法 我认为当视图显示在屏幕上时会调用此方法 但我认为这是不对的 你能解释一下什么时候onLayout方法调用以及我需要在该方法中实现什么 它让我崩溃 因
  • 如何在选择选项的 HTML 标签中应用字体系列

    我正在应用字体系列
  • 从 ArrayNode 创建 Java 8 流

    是否可以创建流com fasterxml jackson databind node ArrayNode 我试过 ArrayNode files ArrayNode json get files Stream
  • 如何在 PDF 完全下载之前使其显示在网络浏览器中

    我有一个客户一直在努力解决网络上 pdf 文件加载缓慢的问题 我的客户有一些非常大的 pdf 文件 几乎有 10 Mb 下载它们需要 3 4 分钟以上 在加载整个文件之前 这些文件不会显示 我们和他们已经看到其他网站的 pdf 一次加载一页
  • topLevelAwait 对 babel-loader 无效:'await' 只允许在异步函数中使用

    webpack5支持topLevelAwait 只需添加以下选项 webpack config js module exports experiments topLevelAwait true 现在我们可以愉快地使用顶级等待 如下所示 im
  • 尽管启用了 kapt. CorrectErrorTypes,kapt 仍将生成的类引用替换为 error.NonExistentClass

    我有一个自定义注释处理器 大致执行以下操作 生成注释类型 使用此类型的类被推迟到后面的轮次 在后面的一轮中 使用这种类型处理类并为它们生成更多文件 到目前为止 这在 Java 中运行良好 但最近 我将一些类从 Java 转换为 Kotlin
  • Xcode 无法导入 tapku 或 kal 库

    我在导入 tapku 库 使用它提供的日历 api 时遇到问题 我也尝试过 Kal 遇到同样的问题 这是我导入它的方法 如果我遗漏了什么 请告诉我 使用 Xcode 4 5 转到文件 gt 将文件添加到项目 gt TapkuLibrary
  • .NET 7 Blazor MAUI - 需要使用 Azure 用户登录进行身份验证

    我正在开发 Blazor MAUI 应用程序 并且我试图要求组织中的用户使用其 Microsoft 工作帐户登录才能访问该应用程序 我在 Blazor MAUI 中找不到太多有关身份验证的文档 并且一直在努力寻找可行的解决方案 目前 我一直
  • Android:View.getTag/setTag 和 IllegalArgumentException

    是的 我知道在调用这些需要密钥的函数版本时 您需要一个唯一的资源 ID 但我一生都无法弄清楚如何创建可以这种方式使用的资源 ID 我的类中的最终变量不起作用 硬编码值也不起作用 两者都抛出了 IllegalArgumentException
  • 如何获取维基百科页面的所有链接及其维基数据 ID?

    什么时候 以下的事情可能实现 在单个查询 API 调用中获取维基百科页面上的所有链接及其各自的维基数据 ID 的列表 通过查询接收各个维基数据项的附加信息 例如属性值 要获取您必须使用的所有维基百科页面链接维基百科API https en
  • 如何从 PDF 中提取数据?

    我的公司通过 Excel 从外部公司接收数据 我们将其导出到 SQL Server 以运行数据报告 他们现在正在更改为PDF格式 有没有办法可靠地从PDF中移植数据并将其插入到我们的SQL Server 2008数据库中 这是否需要编写一个
  • 如何使用GCC将C代码编译为8088汇编?

    我一直在寻找一条信息 但似乎找不到它 也许你们可以帮助我 这是一个简单的问题 如何使用GCC将C代码编译成8088汇编 我正在用 8088 汇编语言编写一个小程序 想知道编译器是如何完成某些事情的 这真的很棒 Thanks djgpp 有一
  • 如何在 Python 中创建 Socket.io 客户端以与 Sails 服务器通信

    我正在运行一个SailsJS我有一个控制器的实例 v0 12 3 我的模型控制器处理 WebSocket socket io 如果用户已通过身份验证 则允许连接 我的模型控制器 module exports Socket connectio
  • 如何使 VS2010 优先选择一个包含目录而不是另一个?

    我正在尝试使用XInput h来自 DirectX SDK 的文件 但此文件也存在于 Windows SDK 中 并且它是该文件的不同变体 我尝试过添加 DXSDK DIR Include 到在项目设置中包含目录 之前和之后 Include
  • 保持分支与 master 保持同步

    我有一个远程存储库 我已从该存储库中提取并从中分支 我想让新分支与 master 所做的更改保持同步 我正在考虑下面的工作流程 它是否有意义或者是否有更好的方法来做到这一点 初始分支和结账 git checkout master git p
  • 未定义的偏移量:1

    在我当前的 PHP 脚本中出现此错误 未定义的偏移量 1 我的代码在这里 query SELECT item id username item content FROM updates ORDER BY update time DESC L
  • 有没有办法在Android中使用Paging Library 3.0实现基于光标的分页?

    我正在使用一个 REST API 它使用基于游标的分页来显示一些结果 我想知道我是否可以使用分页库3 0 https developer android com topic libraries architecture paging v3