如何将PagedListAdapter与多个LiveData一起使用

时间:2018-07-05 16:06:25

标签: android android-recyclerview android-livedata android-paging

我有一个带有 PagedListAdapter 的回收站视图。

onCreate 中,我有以下代码:

 viewModel.recentPhotos.observe(this, Observer<PagedList<Photo>> {
            photoAdapter.submitList(it)
        })

recentPhotos 通过以下方式初始化:

val recentPhotosDataSource = RecentPhotosDataSourceFactory(ApiClient.INSTANCE.photosClient)

        val pagedListConfig = PagedList.Config.Builder()
                .setEnablePlaceholders(false)
                .setInitialLoadSizeHint(INITIAL_LOAD_SIZE)
                .setPageSize(PAGE_SIZE)
                .build()

        recentPhotos = LivePagedListBuilder<Int, Photo>(recentPhotosDataSource, pagedListConfig)
                .setFetchExecutor(Executors.newSingleThreadExecutor())
                .build()

它工作正常。

接下来,我有 search()函数:

private fun searchPhotos(query: String) {
        viewModel.recentPhotos.removeObservers(this)

        viewModel.searchPhotos(query)?.observe(this, Observer {
            photoAdapter.submitList(it)
        })
    }

viewModel.searchPhotos 看起来像这样:

   fun searchPhotos(query: String): LiveData<PagedList<Photo>>? {
        val queryTrimmed = query.trim()

        if (queryTrimmed.isEmpty()) {
            return null
        }

        val dataSourceFactory = SearchPhotosDataSourceFactory(ApiClient.INSTANCE.photosClient, queryTrimmed)

        val livePagedList = LivePagedListBuilder(dataSourceFactory, PAGE_SIZE)
                .setFetchExecutor(Executors.newSingleThreadExecutor())
                .build()

        return livePagedList
    }

但是它不起作用。我有一个错误:

java.lang.IllegalArgumentException: AsyncPagedListDiffer cannot handle both contiguous and non-contiguous lists.

我的问题是,我可以使用一个回收站视图和一个适配器来处理多个/不同的LiveData吗?当我有一个回收站并且需要将其用于最近的物品或用于搜索时,什么是对我的任务最好的解决方案?

2 个答案:

答案 0 :(得分:0)

此错误的原因是因为您要让AsyncPagedListDiffer类比较两个结构不同的列表。

在创建recentPhotos时,您使用了PagedList.Config。但是,在searchPhotos函数中,您仅使用页面大小来构造LiveData<PagedList>。分页库必须比较这两个列表。使用您的配置,无法对其进行比较。

我建议您使用类似的方式构造列表,即使用PagedList.Config对象或仅使用页面大小。

答案 1 :(得分:0)

好像您的recentPhotosDataSource来自Room db。我对吗? Room db创建TiledPagedList,但是扩展SearchPhotosDataSourceFactory(或其他数据源)的PageKeyedDataSource创建ContiguousPagedList。这就是为什么您会收到此错误。

所以我想解决方案将是创建一个新的列表适配器以显示搜索结果。