问题标签 [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.

0 投票
1 回答
2912 浏览

android - 具有多种视图类型的 RecyclerView 和具有边界回调的分页库

我有一个项目,我想向用户显示多个项目(图像、文本、视频等)。我知道 RecyclerView 的多种视图类型是如何工作的。在我的项目中,我包含了大部分推荐的,Android Architecture ComponentsRoomPagingLiveData等。

为了总结项目设计,我遵循了这个对我有很大帮助的codelabRoomlibrary + Paginglibrary with a提供了一种很好的BoundaryCallback方式来实现离线缓存。将数据库视为事实的来源,并让Paging图书馆在Recyclerview需要时通过 a请求更多数据,这DataSource.Factory在我看来是一种非常好的方法。

但是该项目的缺点是它们显示了整个架构组件的东西(RoomPagingwith BoundaryCallback)如何仅适用于一种项目类型。但我有多种视图类型,我无法处理。

在下面,我将向您展示我的项目中的代码片段,以说明我被困在哪里。

让我们从模型开始。假设我们有两种项目类型:图像和文本。

如您所见,我的模型类正在扩展Item密封类。因此,我可以将ImageandText类视为Items。适配器类看起来像这样:

}

在这里,我面临的问题是ItemDiffCallback班级。在该areItemsTheSame方法中,我无法id使用超类访问属性Item。我可以在这里做什么?

现在,我要去存储库类。您可能知道,存储库类首先负责从数据库中检索数据,因为在我的项目中,数据库是事实的来源。如果没有数据或需要更多数据,则分页库使用 BoundaryCallback 类从服务请求更多数据并将它们存储到数据库中。这是我的项目存储库类:

在这种情况下,我的问题是我不知道如何初始化dataSourceFactory变量,因为我有两个DAO类。这些都是:

那么,如何处理呢?

有人可以帮忙吗?

0 投票
0 回答
660 浏览

java - 在分页库中,PagedList 值为 null

我试图使用分页库实现一个带有分页的用户列表。但是,尽管能够从后端获取所有数据,但 PagedList 在观察 LiveData 时为空。

这是代码。

用户模型.java

用户搜索数据源.java

UserSearchDataSourceFactory.java

用户搜索适配器.java

UserSearchViewModel.java

用户搜索片段.java

0 投票
0 回答
240 浏览

android - Paging LoadRange 在完成数据无效后没有被调用

我遇到了 PositionalDataSource 的问题,一旦我使数据源无效,就没有调用 loadRange,只有当我为我的 recyclerview 添加项目装饰以获得粘性标题时才会发生此问题
没有 recyclerview 的项目装饰工作正常
这是我的数据源

我使数据源无效getData(int,int)

这是我的粘性标题项目装饰类

谁能猜到,可能是什么问题?

0 投票
2 回答
377 浏览

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" 一致:

我的配置没有使用占位符,也没有将总数传递给onResultof LoadInitialCallback。分页库的版本是 2.1.1

0 投票
0 回答
597 浏览

android - Android PageKeyedDataSource(分页库)回调错误处理(src中有TODO异常)

我想通过loadInitialloadafter中的 callback.onError(或 callback.onRetryableError)将错误异常传递给我的分页适配器,但总是收到崩溃。经过一些调试后,我在库资源中找到了这个: 在此处输入图像描述

这实际上是我在崩溃跟踪中收到的内容。只是“待办事项”。依赖版本:

'androidx.paging:paging-runtime-ktx:2.1.1'

是否可以在生产中出现这种异常消息,或者我做错了什么?无论如何...问题:将加载错误传递给适配器的任何其他“内置”方法?

0 投票
1 回答
1619 浏览

android - Paging Library recyclerview 不显示更新数据(DB + Network)

我有一个要使用分页库显示的人员列表,从本地数据库加载初始数据,一旦需要更多数据,我调用 API 从服务器获取并将其保存到数据库中。

我的片段:

我的视图模型:

列表适配器:

道:

回调类:

直到这里一切都好(获取的数据保存到 db 中),但是 recyclerview 不会用新数据更新列表,而是只显示初始数据

我已经搜索了这个主题并对其进行了调整,但到目前为止找不到为什么不适合我。

0 投票
2 回答
3355 浏览

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,大多数示例都是这样做的。

知道会发生什么吗?

0 投票
1 回答
762 浏览

android - 使用 Google 的分页库更新 PagedList 中的单个项目

我在 RecyclerView 中有一个简单的口袋妖怪列表,只有口袋妖怪的名字和一个“最喜欢的”切换按钮。我正在使用带有 PageKeyedDataSource 的 Android JetPack 的分页库来检索小块 Pokemon 并将它们显示给用户。只要 Activity 没有被破坏,我只希望数据保持不变(即我不想将数据保持到 Room 或数据库,而是只要 ViewModel 还活着就让它保持不变)。

应用截图

我希望能够单击任何 Pokemon 项目上的心形按钮并将 SimplePokemon 模型中的“isFavorite”字段更新为trueor false。据我了解,如果我想更改该 PagedList 中的单个项目,我需要使 DataSource 无效,并且理论上应该生成一个 PagedList 的新 LiveData,该 LiveData 可以提供给 Adapter 并显示在屏幕上。

问题:如何在不需要 Room 或其他数据库的情况下使用分页库更新 PagedList 中的单个项目?

将来,我想将此解决方案扩展到用户可以喜欢帖子的社交媒体提要,但我不知道是否有必要(或有效)将社交提要项目存储在诸如 Room 之类的数据库中,因为这些提要项目不断变化。所以我选择将它们存储在 ViewModel 中,然后在每次用户退出应用程序时清除它们。

到目前为止,这是我的代码:

简单口袋妖怪.kt:

PokemonViewModel.kt:

口袋妖怪适配器.kt:

PokemonDataSource.kt:

我还想确保每次更新 DataSource 时 RecyclerView 都不会跳到顶部。

理想的情况是,只要 Activity 处于活动状态并能够在本地更新单个 Pokemon 项目,就保留一个 Pokemon 列表。从理论上讲,我还会向后端发送一个 POST 请求以更新后端的口袋妖怪,但我只是想让问题保持简单。

任何帮助将不胜感激。

0 投票
1 回答
2189 浏览

android - 使用分页库显示加载指示器

我已经用 Room 实现了分页库。我正在使用单一事实来源。文章(我的数据)将通过 Retrofit 获取并插入到 Room 数据库中。然后 recyclerview 适配器通过ArticleItemBoundaryCallback监听数据:

存储库决定是否需要从 Internet 获取数据或查找本地缓存(房间数据库)。

但我的问题是我的回收站视图末尾没有加载指示器。用户可能不确定他们是否到达列表末尾或正在加载。我看到了这个谷歌代码示例 ,但我找不到他们添加加载视图的位置。

0 投票
1 回答
367 浏览

android - 当 Room 数据库为数据源时,使用 Paging Library 显示 ProgressBar

我的数据库查询操作可能需要很长时间,所以我想在查询进行时显示一个 ProgressBar。当用户更改排序选项时,这尤其是一个问题,因为它会显示旧列表一段时间,直到新列表出现并更新 RecyclerView。我只是不知道在哪里为这样的查询捕获 Loading 和 Success 状态。

这是我从数据库中获取 PagedList 的方法:

我通过观察这个来更新我的列表:

我需要自定义 DataSource 和 DataSource.Factory 吗?如果是这样,我什至不知道从哪里开始。我相信这将是一个 PositionalDataSource,但我在网上找不到任何实施自定义示例的示例。

我还尝试adapter.registerAdapterDataObserver()了我的 RecyclerView 适配器。当显示新的列表数据时,这会触发各种回调,但是当加载开始和停止时我无法从回调中辨别出来。