Я следую за Android кодовой страницей пейджинга , потому что я пытаюсь реализовать разбиение на страницы, используя только БД с комнатой, и независимо от того, что я делаю, список элементов никогда не отображается.
У меня есть Repository
класс:
suspend fun fetchHeritagesList(
startPosition: Int = 0,
pageSize: Int = DATABASE_PAGE_SIZE
): DataSource.Factory<Int, Heritage> {
val rowsCount = heritageDao.numberHeritagesInDb()
if (rowsCount == 0L) heritageDao.insertAll(parserManager.parseAssetsToEntityList())
return heritageDao.getHeritageEntityDataSource().map { it.toModel() }
}
и моя ViewModel:
val worldHeritagesLiveData: LiveData<PagedList<Heritage>> =
liveData(context = Dispatchers.Main) {
LivePagedListBuilder(
repository.fetchHeritagesList(),
20
).setBoundaryCallback(HeritageBoundaryCallback(repository, viewModelScope))
.build()
}
В моем фрагменте у меня просто есть:
viewModel.worldHeritagesLiveData.observe(viewLifecycleOwner, Observer {
adapter.submitList(it)
})
Реализация моего HeritageBoundaryCallback
заключается в следующем, хотя приложение никогда не попадает туда, поэтому я предполагаю, что есть другая вещь, которая не работает:
class HeritageBoundaryCallback(
private val repository: Repository,
private val scope: CoroutineScope
) : PagedList.BoundaryCallback<Heritage>() {
private var lastRequestedPage = 0
override fun onZeroItemsLoaded() {
scope.launch {
requestData()
}
}
override fun onItemAtEndLoaded(itemAtEnd: Heritage) {
scope.launch {
requestData()
}
}
override fun onItemAtFrontLoaded(itemAtFront: Heritage) {
scope.launch {
requestData()
}
}
private suspend fun requestData() {
repository.fetchHeritagesList(
startPosition = lastRequestedPage++,
pageSize = 20
)
}
}
Делая это, как описано выше, я никогда не вижу вызова adapter.submitList(it)
так что я никогда не вижу никаких данных в своем списке.
Есть ли что-то, что я пропускаю, или что я не правильно делаю?
Заранее большое спасибо!