缺少回调以分页查看?

时间:2018-02-27 05:41:40

标签: android kotlin android-architecture-components

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

我是关注MVP并且还使用一些匕首注射来测试。

在视图中:

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 []

但是当数据源返回项目后,我会看到这些日志:

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

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

1 个答案:

答案 0 :(得分:0)

我有两个错误......

  1. 从未在视图中设置适配器(失败)
  2. 我正在扩展ItemKeyedDataSource而不是PageKeyedDataSource(双重失败)
  3. 我进行了这两项调整,现在一切都按预期进行。