【发布时间】:2018-04-09 20:40:51
【问题描述】:
我使用Paging Library 对我的数据集进行分页。我要做的是在我的数据库中的数据发生更改后刷新RecyclerView。
我有这个LiveData:
val listItems: LiveData<PagedList<Snapshot>> = object : LivePagedListProvider<Long, Snapshot>() {
override fun createDataSource() = SnapshotsDataSource()
}.create(null, PagedList.Config.Builder()
.setPageSize(PAGE_SIZE)
.setInitialLoadSizeHint(PAGE_SIZE)
.setEnablePlaceholders(false)
.build()
)
还有DataSource:
class SnapshotsDataSource : KeyedDataSource<Long, Snapshot>(), KodeinGlobalAware {
val db: FirebaseDb = instance()
override fun getKey(item: Snapshot): Long = item.timestamp
override fun loadInitial(pageSize: Int): List<Snapshot> {
val result = db.getSnapshotsTail(pageSize)
return result
}
override fun loadAfter(key: Long, pageSize: Int): List<Snapshot> {
val result = db.getSnapshotsTail(key, pageSize)
return result.subList(1, result.size)
}
override fun loadBefore(key: Long, pageSize: Int): List<Snapshot> {
return emptyList()
}
}
Adapter 是直截了当的,所以我在此省略。
我尝试在修改数据库时这样做:
fun reload(position) {
listItems.value!!.loadAround(position)
}
但它没有帮助。
【问题讨论】:
-
调用
DataSource#invalidate()方法——虽然它会创建一个新的DataSource... -
当我打电话给
invalidate()时,什么也没有发生。它只是在滚动 RecyclerView 时停止进一步的数据加载 -
如果你调用
invalidate,那么应该调用LivePagedListProvider#createDataSource -
是的。出于某种原因,它调用了十亿次(无限循环)。看起来像库中的错误。无论如何,尚不清楚无效如何有帮助。当我只需要 1 个或几个项目时,它将使整个列表无效。
-
不,没有十亿次,
invalidate()只执行一次操作,文档说:"Signal the data source to stop loading, and notify its callback. If invalidate has already been called, this method does nothing."- 我已经使用它并且它工作得很好 - 如果在你的情况下它没有被调用全部,现在它被调用了十亿次,那么您的代码似乎被破坏了
标签: android pagination android-architecture-components android-paging