【问题标题】:How does Paging 3 handle data and interact with roomPaging 3 如何处理数据并与房间交互
【发布时间】:2021-02-04 21:29:14
【问题描述】:

所以我最近一直在与 paging 3 库进行交互,我学到了很多关于它的知识,但是有一些东西仍然很难掌握。 我的问题分为两点,第一点可能是错误,第二点纯粹是提供信息。

第一点:我注意到将 initialLoadSize 设置为与页面大小相同的大小(我没有尝试其他值)会使适配器在加载完成时跳来跳去(这意味着屏幕外加载开始移动列表位置不交互时)如果这不是错误,那么第一点是“适配器如何(以及使用哪些用户可设置的参数)确定加载后何时移动列表(将哪些项目居中)。

第二点:为了修复第一点的行为,我已将 initialLoadSize 恢复为默认值。我还需要实现我自己的与房间交互的分页源(因为由于某些应用程序逻辑,我需要在列表中进一步加载一些项目,然后再通过分页加载它们,这会阻止分页加载任何更多项目之后这些)并且我无法弄清楚如何处理分页源中的所有边缘情况(例如何时将下一个和上一个键设置为空,以及何时根据参数设置之前和之后的项目)。因此,为了更好地理解这一点,也许有人可以解释这些参数是如何相互作用的。

我可能应该澄清一下,我还使用了远程调解器,并且我正在将房间寻呼源包装在自己的寻呼源中。

我目前正在进行的项目是:https://gitlab.com/sedestrian/pokedex 在“恢复的分页源逻辑”提交下的“开发”分支中。

提前致谢。

【问题讨论】:

    标签: android android-paging android-paging-library android-paging-3


    【解决方案1】:

    我注意到将 initialLoadSize 设置为与页面大小相同的大小(我没有尝试其他值)会使适配器在加载完成时跳来跳去(这意味着屏幕外加载在不交互时开始移动列表位置) 如果这不是错误,那么第一点是“适配器如何(以及使用哪些用户可设置的参数)确定加载后何时移动列表(将哪些项目居中)。

    你说的跳来跳去是什么意思?初次加载前,没有数据吧?

    我猜你的意思是在无效/配置更改情况下 - 在刷新时,为了让 diffutil 保留你的位置,你需要加载用户当前查看 PagingState.anchorPosition 的相同位置,所以你必须以一种为后续刷新提供密钥的方式实现PagingSource.getRefreshKey,至少填充以PagingState.anchorPosition 为中心的当前视口。较大的initialLoadSize 将使您在键的距离方面更加灵活,因此这是一种可能的情况,即更改大小会导致它“跳跃”。

    为了修复第一点中的行为,我已将 initialLoadSize 恢复为默认值。我还需要实现我自己的与房间交互的分页源(因为由于某些应用程序逻辑,我需要在列表中进一步加载一些项目,然后再通过分页加载它们,这会阻止分页加载任何更多项目之后这些)并且我无法弄清楚如何处理分页源中的所有边缘情况(例如何时将下一个和上一个键设置为空,以及何时根据参数设置之前和之后的项目)。因此,为了更好地理解这一点,也许有人可以解释这些参数是如何相互作用的。

    您只需调用adapter.getItem(index)differ.get(index) 即可触发手动加载。这就是在 Paging 中绑定本质上触发加载的方式,但是您需要小心PagingConfig.maxSize,因为加载太远会导致视口中的页面下降,以便 Paging 可以尊重maxSize,同时仍然加载请求的页面。

    null 应设置为 nextKeyprevKey,以防没有更多内容可加载并且您已到达数据集的末尾(最后一页或第一页)。

    itemsBeforeitemsAfter 用于控制占位符的数量,如果PagingConfig.enablePlaceholders 被禁用,则此计数基本上被忽略,在这种情况下最好保留未定义的默认值。这用于计数数据集。请阅读官方文档,因为那里有一些可能对您有帮助的信息:https://developer.android.com/reference/kotlin/androidx/paging/PagingSource.LoadResult.Page

    【讨论】:

    • 是的,我已阅读文档,但发现情况并非如此。 prev/next 键和之前/之后的项目以及加载项目的数量和加载类型的组合用于触发远程加载并在适配器中呈现结果。我观察到的是:gist.github.com/sedestrian/83902b0b9089bcf86e7e33dcb61c1d9e 这会正确加载所有内容
    • 我调整了我的代码以遵循观察到的结果并设法使其工作,但它真的是在模仿,并且不了解我在做什么
    • 啊,是的 - 对于RemoteMediator,它本质上只是在PagingSource 到达结束时触发的回调,并且要标记远程加载的结束,您只需返回RemoteMediator.Succes(endOfPaginationReached = true)。但所有可见数据实际上由PagingSource 驱动,本地源中的负载由nextKey / prevKey 驱动
    • 我想我也注意到了之后的项目和之前的项目告诉分页加载后要关注哪个页面(在屏幕上居中的页面),但我不太确定。当传递错误的参数时会发生这样的事情:youtu.be/QePyT2fN7J8
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多