我有一个带有 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吗?当我有一个回收站并且需要将其用于最近的物品或用于搜索时,什么是对我的任务最好的解决方案?
答案 0 :(得分:0)
此错误的原因是因为您要让AsyncPagedListDiffer
类比较两个结构不同的列表。
在创建recentPhotos
时,您使用了PagedList.Config
。但是,在searchPhotos
函数中,您仅使用页面大小来构造LiveData<PagedList>
。分页库必须比较这两个列表。使用您的配置,无法对其进行比较。
我建议您使用类似的方式构造列表,即使用PagedList.Config
对象或仅使用页面大小。
答案 1 :(得分:0)
好像您的recentPhotosDataSource
来自Room db。我对吗?
Room db创建TiledPagedList
,但是扩展SearchPhotosDataSourceFactory
(或其他数据源)的PageKeyedDataSource
创建ContiguousPagedList
。这就是为什么您会收到此错误。
所以我想解决方案将是创建一个新的列表适配器以显示搜索结果。