缺少使用分页查看的回调?

Missing callback to view with pagination?

我正在尝试启动分页并使用 Google 的新库,但看到了一些奇怪的行为。我不确定我哪里出错了。

我正在关注 MVP,并且还使用了一些 Dagger 注入来实现可测试性。

在视图中:

val adapter = ItemsAdapter()
viewModel.getItems(itemCategoryId, keywords).observe(this, Observer {
  Log.d(TAG, "Items updated $it")
  adapter.setList(it)
})

数据源工厂:

class ItemDataSourceFactory(
        private val api: Api,
        private val retryExecutor: Executor
) : DataSource.Factory<Long, Item> {

    private val mutableLiveData = MutableLiveData<ItemDataSource>()

    override fun create(): DataSource<Long, Item> {
        val source = ItemDataSource(api, retryExecutor)
        mutableLiveData.postValue(source)
        return source
    }
}

数据来源:

class ItemDataSource(
        private val api: Api,
        private val retryExecutor: Executor
): ItemKeyedDataSource<Long, Item>() {

    companion object {
        private val TAG = ItemKeyDataSource::class.java
    }

    override fun getKey(item: Item): Long = item.id

    override fun loadBefore(params: LoadParams<Long>, callback: LoadCallback<Item>) {
        // ignored, since we only ever append to our initial load
    }

    override fun loadInitial(params: LoadInitialParams<Long>, callback: LoadInitialCallback<Item>) {
        api.loadItems(1, params.requestedLoadSize)
                .subscribe({
                    Logger.d(TAG, "Page 1 loaded. Count ${params.requestedLoadSize}.\nItems: ${it.items}")
                    callback.onResult(it.items as MutableList<Item>, 0, it.item.size)
                }, {})
    }

    override fun loadAfter(params: LoadParams<Long>, callback: LoadCallback<Item>) {
        api.loadItems(params.key, params.requestedLoadSize)
                .subscribe({
                    Logger.d(TAG, "Page ${params.key} loaded. Count ${params.requestedLoadSize}.\nItems: ${it.items}")
                    callback.onResult(it.itemsas MutableList<Item>)
                }, {})
    }
}

和视图模型:

  class ItemsViewModel @Inject internal constructor(
        private val repository: ItemsMvp.Repository
): ViewModel(), ItemsMvp.Model {

    override fun items(categoryId: Long, keywords: String?): LiveData<PagedList<Item>> {
        return repository.items(categoryId, keywords)
    }
}

存储库层:

class ItemsRepository @Inject internal constructor(
        private val api: Api,
) : ItemsMvp.Repository {

    companion object {
        const val DEFAULT_THREAD_POOL_SIZE = 5
        const val DEFAULT_PAGE_SIZE = 20
    }

    private val networkExecutor = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE)
    private val pagedListConfig = PagedList.Config.Builder()
            .setEnablePlaceholders(false)
            .setInitialLoadSizeHint(DEFAULT_PAGE_SIZE)
            .setPageSize(DEFAULT_PAGE_SIZE)
            .build()

    override fun items(categoryId: Long, keywords: String?): LiveData<PagedList<Item>> {
         val sourceFactory = ItemDataSourceFactory(api, networkExecutor)

        // provide custom executor for network requests, otherwise it will default to
        // Arch Components' IO pool which is also used for disk access
        return LivePagedListBuilder(sourceFactory, pagedListConfig)
                .setBackgroundThreadExecutor(networkExecutor)
                .build()
    }
}

问题是我在加载第一页后没有获得视图更新。

我从 onCreate() 看到这个日志:

 Items updated []

但是当数据源 returns 项目之后,我看到这些日志:

Page 1 loaded. Count 20.
Items: [Item(....)]

但是 我从来没有看到订阅视图模型的视图获得更新以在适配器上设置列表。如果你很好奇,我正在使用 PagedListAdapter。

我有两个错误...

  1. 从未在视图中设置适配器(失败)
  2. 我正在扩展 ItemKeyedDataSource 而不是 PageKeyedDataSource(双重失败)

我进行了这两项调整,现在一切都按预期运行。