我正在从room
数据库表中检索项目:
@Query("SELECT * FROM items WHERE owner_id = :ownerId ORDER BY type, position")
abstract override fun itemsDataSourceFactory(ownerId: Int): DataSource.Factory<Int, Item>
PagedList是使用
创建的 val builder = LivePagedListBuilder(
dataSourceFactory,
PagedList.Config.Builder()
.setEnablePlaceholders(true)
.setPageSize(ITEMS_PER_PAGE)
.build()
)
.setBoundaryCallback(boundaryCallback)
boundaryCallback
从网络加载项目并将其插入room
数据库。
问题是,当用户快速滚动/翻转列表底部的列表项时,它们开始跳来跳去。好像它们从一个位置移到了另一个位置。并在1-2跳之后稳定在正确的位置上。
调试DiffUtil
,即使没有删除-刚刚添加的项目,我仍然可以看到dispatchRemovals
的报告。
另一件事-通过room
从DataSource
检索的项目不是恒定大小或相同页面大小。
val dataSourceFactory = dao.itemsDataSourceFactory(userId)
.mapByPage{ items ->
Log.d("${items.map { it.position }}")
items
}
上面的代码记录了截然不同的结果。页面大小可以从表中的任何一项到位置不同的20个项目。例如:
[100, 101, 102, 103, 104]
[80]
[60, 61, 62, 63,64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
因此订购可以按预期进行,但是页面大小很奇怪。不知道为什么会这样。
使用
android.arch.paging:1.0.1
和room
版本1.1.1
在最新的androidx.paging:paging-runtime:2.1.0-rc01
上进行了测试,结果相同。