MutableLiveData赢得';t使用PagedList触发loadAfter从Android ROM获取
我有70个iTen存储在我的ROM中,我想获取15个分页量。到目前为止,我读了很多关于相关问题的帖子,但是没有一篇对我有用 未触发MutableLiveData赢得';t使用PagedList触发loadAfter从Android ROM获取,android,pagedlist,mutablelivedata,android-rom,android-pagedlistview,Android,Pagedlist,Mutablelivedata,Android Rom,Android Pagedlistview,我有70个iTen存储在我的ROM中,我想获取15个分页量。到目前为止,我读了很多关于相关问题的帖子,但是没有一篇对我有用 未触发loadAfter的一些可能原因: :调用getIteminsideonBindViewHolder :调用submitList至PagedListAdapter :用PagedListAdapter替换ListAdapter 我假设数据绑定很好,因为一切都可以在不尝试分页的情况下工作 我在模仿我的数据源来了解发生了什么。有些函数被挂起,因为它们应该有来自ROM的数据
loadAfter
的一些可能原因:
:调用getItem
insideonBindViewHolder
:调用submitList
至PagedListAdapter
:用PagedListAdapter
替换ListAdapter
我假设数据绑定
很好,因为一切都可以在不尝试分页的情况下工作
我在模仿我的数据源来了解发生了什么。有些函数被挂起,因为它们应该有来自ROM的数据,而ROM需要这些数据。我的代码状态如下:
适配器
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
getItem(position).let { wkda ->
with(holder) {
wkda?.apply { bind(createOnClickListener(this)) }
}
}
}
片段
vm.manufacturers.observe(viewLifecycleOwner) { manufacturers ->
adapter.submitList(manufacturers)
}
视图模型
var manufacturers: MutableLiveData<PagedList<WKDA>> = MutableLiveData()
init {
viewModelScope.launch {
repository.getManufacturers(manufacturers)
}
}
我在这里遗漏了什么?检查后:loadAfter被正确调用。问题在于模型本身: wkda.id始终具有相同的“name”值
DiffCallback将旧的对象列表与新的对象列表进行了比较,但没有发现差异,因此没有将“duplicates”项添加到适配器中您确定没有触发loadAfter吗?我想到的是它可以被调用,但列表中的新项目与适配器中已经存在的项目相同,因此新项目没有添加请回答:
返回WKDA(“name”,“author$key”)
每个模拟对象都被设置为“name”
和DiffCallback
正在比较wkda.id
,它始终具有“name”
值。从ROM
中也可以看出iTen发生了什么。非常感谢。
suspend fun getManufacturers(manufacturers: MutableLiveData<PagedList<WKDA>>) {
withContext(Dispatchers.IO) {
manufacturers.postValue(ManufacturerPagedList.
getInstance().
fetchPage())
}
}
private val executor = ManufacturerExecutor()
private val paginationConfig: PagedList.Config = PagedList.Config.Builder()
.setPageSize(PAGE_SIZE)
.setPrefetchDistance(FETCH_DISTANCE)
.setEnablePlaceholders(false)
.build()
companion object {
@Volatile
private var instance: ManufacturerPagedList? = null
fun getInstance() = instance ?: synchronized(this) {
ManufacturerPagedList().also {
instance = it
}
}
}
fun fetchPage(): PagedList<WKDA> = PagedList.Builder<Int, WKDA>(
MockDataSource(),
paginationConfig)
.setInitialKey(INITIAL_KEY)
.setFetchExecutor(executor)
.setNotifyExecutor(executor)
.build()
}
class MockDataSource : PageKeyedDataSource<Int, WKDA>() {
override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, WKDA>) {
callback.onResult(List(20) { generatePost(params.requestedLoadSize) }.toList(), -1, 1)
}
override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, WKDA>) {
callback.onResult(List(20) { generatePost(params.key) }.toList(), params.key + 1)
}
override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, WKDA>) {
callback.onResult(List(20) { generatePost(params.key) }.toList(), params.key - 1)
}
private fun generatePost(key: Int): WKDA {
return WKDA("name", "author $key")
}
}
const val INITIAL_KEY: Int = 0
const val PAGE_SIZE: Int = 15
const val FETCH_DISTANCE: Int = 1