Android Пейджинговая библиотека - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь использовать Android Пейджинг с ItemKeyedDataSource. Сетевой вызов выбирает список элементов, но мой pagedList не обновляется со списком.

`override fun loadInitial(
        params: LoadInitialParams<String>,
        callback: LoadInitialCallback<InteractionEntity>
    ) {
        Timber.d("load Initial called")
        interactionsRepository.getInteractions(params.requestedLoadSize,reviewFiltersEntity.locationId,reviewFiltersEntity.startDate,
            reviewFiltersEntity.endDate,reviewFiltersEntity.siteUrls,reviewFiltersEntity.ratingFilters,reviewFiltersEntity.responseStatus,null,null)
            .subscribe(object: Observer<List<InteractionEntity>>{
                override fun onComplete() {
                    Timber.d("getInteractions complete")
                }

                override fun onSubscribe(d: Disposable) {
                    Timber.d("getInteractions subscribed ")
                }

                override fun onNext(t: List<InteractionEntity>) {
                    Timber.d("getInteractions onNext "+t.size)
                    callback.onResult(t)
                }

                override fun onError(e: Throwable) {
                    Timber.d("getInteractions error "+e.message)
                }
            })
    }`

DataSourceFactory

 'var interactionDataSourceLiveData = MutableLiveData<InteractionDataSource>()


override fun create(): DataSource<String, InteractionEntity> {
    val interactionDataSource = InteractionDataSource(interactionsRepository,locationsRepository,reviewFiltersEntity)
    interactionDataSourceLiveData.postValue(interactionDataSource)
    return interactionDataSource
}'

ViewModel

  'fun loadInteractions(reviewFiltersEntity: ReviewFiltersEntity){
         interactionDataSourceFactory = InteractionDataSourceFactory(interactionsRepository,locationsRepository,reviewFiltersEntity)
        interactionDataSourceLiveData = interactionDataSourceFactory?.interactionDataSourceLiveData

        var config = PagedList.Config.Builder()
            .setEnablePlaceholders(true)
            .setInitialLoadSizeHint(10)
            .setPageSize(20)
            .setPrefetchDistance(4)
            .build()

        interactionsPagedList = LivePagedListBuilder<String, InteractionEntity>(interactionDataSourceFactory!!,config)
            .setFetchExecutor(executor)
            .build()
    }'

Activity

'interactionPagingViewModel?.loadInteractions(reviewFiltersEntity)

        interactionPagingViewModel?.interactionsPagedList?.observe(this, Observer {

            Timber.d("interaction paged list changed ")
            if(!it.isNullOrEmpty()){
                Timber.d("fetched interactions in paging "+it.size)
                adapter.submitList(it)

            }else{
                showError(R.string.error_fetching_reviews)
            }

        })'

Я вижу список, извлеченный в loadInitial, но я не вижу того же onChanged of Observer выше.

Любая идея Что может быть не так?

1 Ответ

0 голосов
/ 31 марта 2020

Нашел решение. Проблема была в источнике данных Android Для пейджинга требовалось, чтобы вызовы API были синхронными Поскольку поток источника данных и поток вызова API различались, источник данных не смог опубликовать результат, полученный вызовом API. Поэтому вместо подписки я вызвал blockingFirst (), и это сработало.

...