问题标签 [android-paging-library]
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.
android - 具有多种视图类型的 RecyclerView 和具有边界回调的分页库
我有一个项目,我想向用户显示多个项目(图像、文本、视频等)。我知道 RecyclerView 的多种视图类型是如何工作的。在我的项目中,我包含了大部分推荐的,Android Architecture Components
如Room
、Paging
、LiveData
等。
为了总结项目设计,我遵循了这个对我有很大帮助的codelab。Room
library + Paging
library with a提供了一种很好的BoundaryCallback
方式来实现离线缓存。将数据库视为事实的来源,并让Paging
图书馆在Recyclerview
需要时通过 a请求更多数据,这DataSource.Factory
在我看来是一种非常好的方法。
但是该项目的缺点是它们显示了整个架构组件的东西(Room
和Paging
with BoundaryCallback
)如何仅适用于一种项目类型。但我有多种视图类型,我无法处理。
在下面,我将向您展示我的项目中的代码片段,以说明我被困在哪里。
让我们从模型开始。假设我们有两种项目类型:图像和文本。
如您所见,我的模型类正在扩展Item
密封类。因此,我可以将Image
andText
类视为Item
s。适配器类看起来像这样:
}
在这里,我面临的问题是ItemDiffCallback
班级。在该areItemsTheSame
方法中,我无法id
使用超类访问属性Item
。我可以在这里做什么?
现在,我要去存储库类。您可能知道,存储库类首先负责从数据库中检索数据,因为在我的项目中,数据库是事实的来源。如果没有数据或需要更多数据,则分页库使用 BoundaryCallback 类从服务请求更多数据并将它们存储到数据库中。这是我的项目存储库类:
在这种情况下,我的问题是我不知道如何初始化dataSourceFactory
变量,因为我有两个DAO
类。这些都是:
那么,如何处理呢?
有人可以帮忙吗?
java - 在分页库中,PagedList 值为 null
我试图使用分页库实现一个带有分页的用户列表。但是,尽管能够从后端获取所有数据,但 PagedList 在观察 LiveData 时为空。
这是代码。
用户模型.java
用户搜索数据源.java
UserSearchDataSourceFactory.java
用户搜索适配器.java
UserSearchViewModel.java
用户搜索片段.java
android - Paging LoadRange 在完成数据无效后没有被调用
我遇到了 PositionalDataSource 的问题,一旦我使数据源无效,就没有调用 loadRange,只有当我为我的 recyclerview 添加项目装饰以获得粘性标题时才会发生此问题
没有 recyclerview 的项目装饰工作正常
这是我的数据源
我使数据源无效getData(int,int)
这是我的粘性标题项目装饰类
谁能猜到,可能是什么问题?
android - 我不使用 ContiguousPagedList 时出现 ContiguousPagedList onPageError
我有定义loadInitial
和的 PositionalDataSource 的实现loadRange
。分页工作正常,但是在某些边界条件下(可能与在退出屏幕时正在加载下一页有关)应用程序崩溃时出现androidx.paging.ContiguousPagedList$1.onPageError (ContiguousPagedList.java:153)
. 但是每个https://developer.android.com/reference/android/arch/paging/PositionalDataSource我的来源不是连续的?
在 ContiguousPagedList 的 onPageError 下发生崩溃,与 "todo" 一致:
我的配置没有使用占位符,也没有将总数传递给onResult
of LoadInitialCallback
。分页库的版本是 2.1.1
android - Paging Library recyclerview 不显示更新数据(DB + Network)
我有一个要使用分页库显示的人员列表,从本地数据库加载初始数据,一旦需要更多数据,我调用 API 从服务器获取并将其保存到数据库中。
我的片段:
我的视图模型:
列表适配器:
道:
回调类:
直到这里一切都好(获取的数据保存到 db 中),但是 recyclerview 不会用新数据更新列表,而是只显示初始数据
我已经搜索了这个主题并对其进行了调整,但到目前为止找不到为什么不适合我。
android - RecyclerView 与 Paging Library 和 PositionalDataSource 保持为空
我正在尝试在我的项目中配置 Android Paging 库,以将分页的消息列表加载到 RecyclerView 中。由于我的 API 使用偏移量和最大值,因此我使用的是 PositionalDataSource。
这是我的 DataSource 实现,其中 DataStore 使用 RetroFit 加载消息,我可以在控制台中看到消息正在正确加载,并转换为 MessageListItem 的实例:
这是我的 DataSourceFactory 实现:
这是我的 MessageListAdapter 实现:
最后是我的 ViewModel:
这是片段中的 onViewCreated 实现,它应该显示名为 messageList 的回收器视图:
问题是我可以看到数据正在从服务器加载,但它从未到达回收站视图。如果我在观察者行 ( messageListAdapter.submitList(messages)
) 上添加断点,我会收到一次带有空消息列表的调用,仅此而已。
我不得不承认我真的对所有这些类以及它们应该做什么感到困惑,这是我在 Android 中的第一个分页实现,我不得不调整我在这里和那里找到的代码,因为我不想使用Room 数据库、RxJava 或 PageKeyedDataSource,大多数示例都是这样做的。
知道会发生什么吗?
android - 使用 Google 的分页库更新 PagedList 中的单个项目
我在 RecyclerView 中有一个简单的口袋妖怪列表,只有口袋妖怪的名字和一个“最喜欢的”切换按钮。我正在使用带有 PageKeyedDataSource 的 Android JetPack 的分页库来检索小块 Pokemon 并将它们显示给用户。只要 Activity 没有被破坏,我只希望数据保持不变(即我不想将数据保持到 Room 或数据库,而是只要 ViewModel 还活着就让它保持不变)。
我希望能够单击任何 Pokemon 项目上的心形按钮并将 SimplePokemon 模型中的“isFavorite”字段更新为true
or false
。据我了解,如果我想更改该 PagedList 中的单个项目,我需要使 DataSource 无效,并且理论上应该生成一个 PagedList 的新 LiveData,该 LiveData 可以提供给 Adapter 并显示在屏幕上。
问题:如何在不需要 Room 或其他数据库的情况下使用分页库更新 PagedList 中的单个项目?
将来,我想将此解决方案扩展到用户可以喜欢帖子的社交媒体提要,但我不知道是否有必要(或有效)将社交提要项目存储在诸如 Room 之类的数据库中,因为这些提要项目不断变化。所以我选择将它们存储在 ViewModel 中,然后在每次用户退出应用程序时清除它们。
到目前为止,这是我的代码:
简单口袋妖怪.kt:
PokemonViewModel.kt:
口袋妖怪适配器.kt:
PokemonDataSource.kt:
我还想确保每次更新 DataSource 时 RecyclerView 都不会跳到顶部。
理想的情况是,只要 Activity 处于活动状态并能够在本地更新单个 Pokemon 项目,就保留一个 Pokemon 列表。从理论上讲,我还会向后端发送一个 POST 请求以更新后端的口袋妖怪,但我只是想让问题保持简单。
任何帮助将不胜感激。
android - 使用分页库显示加载指示器
我已经用 Room 实现了分页库。我正在使用单一事实来源。文章(我的数据)将通过 Retrofit 获取并插入到 Room 数据库中。然后 recyclerview 适配器通过ArticleItemBoundaryCallback监听数据:
存储库决定是否需要从 Internet 获取数据或查找本地缓存(房间数据库)。
但我的问题是我的回收站视图末尾没有加载指示器。用户可能不确定他们是否到达列表末尾或正在加载。我看到了这个谷歌代码示例 ,但我找不到他们添加加载视图的位置。
android - 当 Room 数据库为数据源时,使用 Paging Library 显示 ProgressBar
我的数据库查询操作可能需要很长时间,所以我想在查询进行时显示一个 ProgressBar。当用户更改排序选项时,这尤其是一个问题,因为它会显示旧列表一段时间,直到新列表出现并更新 RecyclerView。我只是不知道在哪里为这样的查询捕获 Loading 和 Success 状态。
这是我从数据库中获取 PagedList 的方法:
我通过观察这个来更新我的列表:
我需要自定义 DataSource 和 DataSource.Factory 吗?如果是这样,我什至不知道从哪里开始。我相信这将是一个 PositionalDataSource,但我在网上找不到任何实施自定义示例的示例。
我还尝试adapter.registerAdapterDataObserver()
了我的 RecyclerView 适配器。当显示新的列表数据时,这会触发各种回调,但是当加载开始和停止时我无法从回调中辨别出来。