问题标签 [android-paging]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2431 浏览

android - 聊天应用程序中的分页库

根据来自 Google 的 Yigit Boyar 的回应,Live Data 并不是聊天应用程序的最佳用例,因为如果它们同时出现,它可能会丢失显示某些项目。他建议使用新的 Google 分页库。我一直在为我的收件箱(所有向用户发送消息的人)和内部聊天(消息本身)使用 ItemKeyedDataSource。问题如下:

1-从聊天中,当用户向下滚动时,用户检索旧消息,这意味着这些消息的插入应该在适配器的位置0,而不是像分页库那样按顺序插入。如何将插入项目的位置交替替换为新消息的顺序,以及旧消息的位置 0?

2-从收件箱(向用户发送消息的人),我在这里再次使用 ItemKeyedDataSource,问题是我想维护存储库中的多文档侦听器(我正在使用 Firebase Firestore),所以我可以检测到每次新人与用户交谈时。问题是callback.onResult只调用一次,当 Firebase 发送另一个用户时失败。如何维护可更新列表?

0 投票
1 回答
1803 浏览

android - Android分页边界回调说明

我已经在我的应用程序中集成了分页组件,它工作得非常好(几乎)。我有数据库+网络模型。数据库最初有一些项目被LivePagedListBuilder. 我观察到这一点LiveData<PagedList<InboxEntity>>并最终将列表提供给PagedListAdapter#submitList(PagedList<T> pagedList),例如:

DAO#getItemList返回DataSource.Factory<Integer, Entity>

我正在监听边界回调并在到达分页列表末尾时触发网络调用。该调用再次填充数据库。

还有一件事。我已经AdapterDataObserver在回收站视图上注册了,因为如果在开头插入了一个项目,我必须滚动到顶部位置:

我在这个模型中面临一个问题:

进行网络调用后,再次填充数据库并onChanged使用 new 调用函数PagedList<Entity>。现在,这个分页列表是否只包含新项目。我已经证实了这一点。

但是onItemRangeInserted方法也是用positionStartas调用的0,这表明项目是在开头插入的。但他们不是。它们被插入到最后,由 stetho db 检查员确认。

那么为什么onItemRangeInserted被称为positionStartas0呢?这让我很难区分何时在适配器的开头插入新项目以及何时在末尾插入项目。

编辑:

的值为itemCount10,这是我的页面大小。

在 DiffCallback 中,我只是比较了函数中两个实体的主键列areItemsTheSame

0 投票
1 回答
3286 浏览

java - 具有自定义数据源偏移量的 Android 分页库 RecyclerView 中的项目

我正在制作一个 TO-DO 列表应用程序,我想要一个精美的列表,其中任务被分组在带有日期的标题下(类似于Splen-DO的)。我正在使用带有 Room(作为数据存储)的 Android Paging 库(带有 RecyclerView)。对于标题,我使用 RecyclerView 的视图类型并将标题添加到列表中,我使用的是自定义数据源,它包装了房间的数据源,而不是返回任务对象,它返回一个可以是任务或任务的对象标题。

它是这样工作的:

  • 分页库要求我的数据源加载项目,它计算由标题引起的偏移量,从数据库加载数据并将标题添加到任务(和标题)列表中并返回它。
  • 分页库使用我的适配器创建 ViewHolders 和视图并显示结果

在我对数据库进行更改之前,一切正常。项目在 RecyclerView 中无缘无故地移动,一些重复并且在 RecyclerView 的乞求上有一些空的占位符。到目前为止,我一直在尝试解决“乞讨时的空占位符”问题。

我首先检查了我的数据源,它返回没有偏移的正确数据。然后我检查了适配器。getItem() 方法返回所有具有偏移量的项目和开头的一些空项目。当我开始深入挖掘时,我发现它是由 PagedStorage 中的一些 mLoadingNullCount 引起的,我不知道它的用途是什么,因为它没有文档。

截图

列表正常工作
列表正常
工作 列表 顶部的空占位符,在我对列表进行更改后
空占位符
列出错误 (gif)
错误列表

一些代码

请忽略一些变量和类名,我使用了一些捷克语单词,以免它们与某些系统类混淆。
Ukol = 任务

适配器: 数据源: 片段:UkolListAdapter.java
MyDatasource.java
UkolListFragment.java

笔记

如果您需要更多代码或解释,请发表评论,我会为您添加。

编辑

我发现了一个错误。Room 数据库中的数据源可能不会在您请求的位置为您提供列表启动,但在它想要的位置,并为您提供参数中loadInitial()的索引(返回的列表开始的位置)。所以我返回了错误的数据。所以我添加了一些算法,计算我实际返回的数据。我没有解决问题。int positiononResult()loadInitial()LoadInitial()

0 投票
0 回答
274 浏览

android - AsyncListUtil 和数据分页库之间的区别?

Android 引入了一个新的分页库,即Data Paging. 以前我们有一个AsyncListUtil类与 RecyclerView 一起处理异步数据加载。

Data paging也可以与 RecyclerView 一起使用,并执行与 AsyncListUtil 相同的任务,以及与架构组件相关的内容。

除了架构相关的东西之外,它们之间AsyncListUtil的实际区别是什么。Data paging library

0 投票
1 回答
1650 浏览

android - 带有自定义数据源的分页库在房间更新时不更新行

我一直在使用RecyclerView实现新的分页库,并在Architecture Components之上构建了一个应用程序。

填充列表的数据来自Room数据库。实际上,它是从网络中获取的,存储在本地数据库中并提供给列表。

为了提供构建列表所需的数据,我实现了自己的自定义PageKeyedDataSource。除了一个小细节外,一切都按预期工作。列表显示后,如果列表行元素的数据发生任何变化,则不会自动更新。因此,例如,如果我的列表显示具有字段name的项目列表,并且突然,该字段在本地 Room 数据库中针对某个行项目进行了更新,则该列表不会自动更新行 UI。

此行为仅在使用自定义 DataSource 时发生,这与从DAO自动获取 DataSource 时不同,通过直接返回DataSource Factory。但是,我需要实现一个自定义数据源。

我知道它可以通过调用 DataSource 上的invalidate()方法来重建更新的列表。但是,如果应用程序一次显示 2 个列表(例如每个半屏),并且该项目出现在两个列表中,则需要分别为两个列表调用invalidate()

我想到了一个解决方案,它不是使用项目类的实例来填充每个ViewHolder,而是使用它的LiveData包装版本,以使每一行观察其自己的项目的变化并在必要时更新该行 UI . 尽管如此,我还是看到了这种方法的一些缺点:

  1. 必须将LifeCycleOwner(例如包含 RecyclerView 的 Fragment)传递给PagedListAdapter,然后将其转发给 ViewHolder,以便观察 LiveData 包装的项目。
  2. 将为每个列表的新行注册一个新的观察者,所以我根本不知道它是否有过多的计算和内存成本,考虑到它将为应用程序中的每个列表完成,其中有很多列表。
  3. 由于 LifeCycleOwner 观察 LiveData 包装的项目将是,例如,包含 RecyclerView 的 Fragment,而不是 ViewHolder 本身,因此每次该项目发生更改时都会通知观察者,即使包含该项目的行不是偶数在那一刻可见,因为列表已滚动,在我看来,这似乎是一种资源浪费,可能会不必要地增加计算成本。

我根本不知道,即使考虑到这些缺点,它是否看起来是一种不错的方法,或者,也许你们中的任何人都知道任何其他更清洁、更好的管理方法。

先感谢您。

0 投票
3 回答
9994 浏览

android - 如何为测试创建对象的 PagedList?

我一直在使用 Google 的 arch 库,但让测试变得困难的一件事是使用PagedList.

对于此示例,我使用存储库模式并从 API 或网络返回详细信息。

所以在 ViewModel 中我调用了这个接口方法:

然后,存储库将RxPagedListBuilder用于创建ObservablePagedList 类型的内容:

我希望能够让测试设置从这些返回PagedList<Foo>. 类似的东西

两个问题:

  1. 这可能吗?
  2. 我如何创建一个PagedList<Foo>

我的目标是以更端到端的方式进行验证(例如确保屏幕上显示正确的 Foos 列表)。片段/活动/视图是PagedList<Foo>从 ViewModel 观察的。

0 投票
4 回答
6193 浏览

android - 分页库 - 网络 + db 的边界回调,API 获取页面和大小

简短的问题

使用使用页面+大小的API来加载新页面和BoundaryCallback类的API从架构组件处理分页库上的数据库+网络的正确方法是什么?

研究与解释

目前,BoundaryCallback用于架构组件的分页库中的类接收列表中元素的实例作为参数,而没有该元素所在位置的实际上下文。它发生在onItemAtFrontLoaded和中onItemAtEndLoaded

我的 Api 应该接收页面和页面大小以加载下一个数据块。作为分页列表构建器的一部分添加的边界回调应该告诉您何时根据预取距离和页面大小加载下一页数据。

由于 Api 需要提供页码和页面大小,因此我看不到仅通过接收列表中提供的元素之一来将其发送到 Api 的方法onItemAtFrontLoadedonItemAtEndLoaded检查此链接中的 google 示例,他们使用最后一个元素的名称来获取下一个元素,但这不适合带有页面 + 大小的 Api。

他们还有另一个仅使用网络的示例PagedKeyedDatasource,但没有关于如何将其与数据库和 BoundaryCallback 混合的示例或线索。

编辑:到目前为止,我发现的唯一解决方案是将最后加载的页面存储在共享首选项中,但这听起来像是一个肮脏的把戏。

有关官方输入,请参阅 https://github.com/googlesamples/android-architecture-components/issues/252#issuecomment-392119468

0 投票
1 回答
1073 浏览

android - 实现 android.arch.paging:runtime:1.0.0

将库添加到 gradle 后:

在项目中使用 PagerListAdapter 时,会产生错误:

“将库 'Grangle: android.arch.paging:runtime-1.0.0' 添加到类路径”

0 投票
1 回答
429 浏览

java - 分页库 Android - 不返回任何结果

我正在一个项目中工作(使用 Android 的 Room Persistence Library),我想在其中实现 Google 最近推出的分页库。我试图在不使用它的情况下解决这个问题,一切正常,但是当我按照一些教程尝试使用它时,我没有收到任何数据。你们能帮帮我吗?我不知道我做错了什么。

导航道

存储库

视图模型

用户界面片段

0 投票
1 回答
1412 浏览

android - Android 分页库重试 loadRange() 或 loadAfter()

我正在尝试从 android 架构组件中实现新的分页库。基本功能工作正常,但我需要为loadRange()or添加重试功能loadAfter()。如果发生网络错误或设备离线,我需要重试这些。我已经尝试过dataSource.invalidate()丢弃整个数据源,这似乎是一种浪费。有没有办法做到这一点?

这是我的代码: