【问题标题】:Android Paging libraryAndroid 分页库
【发布时间】:2020-03-30 17:30:04
【问题描述】:

我正在尝试将 Android Paging 与 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)
                }
            })
    }`

数据源工厂

 'var interactionDataSourceLiveData = MutableLiveData<InteractionDataSource>()


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

视图模型

  '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()
    }'

活动

'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 中获取的列表,但我没有看到上面 Observer 的相同 onChanged。

知道有什么问题吗?

【问题讨论】:

  • 能否分享一下适配器类的 submitList 方法?

标签: kotlin android-paging


【解决方案1】:

找到了解决办法。问题是 Android Paging 的 DataSource 要求 api 调用是同步的。由于数据源的线程和api调用的线程不同,数据源无法发布api调用获取的结果。所以我没有订阅,而是调用了 blockingFirst() 并且它起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-26
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多