Android: Использование PagedList.BoundaryCallback не возвращает ни одного элемента - PullRequest
0 голосов
/ 12 января 2020

Я следую за 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) так что я никогда не вижу никаких данных в своем списке.

Есть ли что-то, что я пропускаю, или что я не правильно делаю?

Заранее большое спасибо!

...