我正在制作一个 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 position
onResult()
loadInitial()
LoadInitial()