MutableLiveData 不会触发 loadAfter 使用 PagedList 从 Android ROM 中获取

MutableLiveData won't trigger loadAfter to fetch from Android ROM using PagedList

我的 ROM 上存储了 70 个项目,我想获取 15 个的分页数量。到目前为止,我阅读了很多有关相关问题的帖子,但是 none 其中对我有用。

loadAfter 未被触发的一些可能原因:

Solution 1 : 在 onBindViewHolder

中调用 getItem

: 调用 submitListPagedListAdapter

: 将 ListAdapter 替换为 PagedListAdapter

我认为 DataBinding 没问题,因为一切正常,无需尝试分页。

我正在模拟我的数据源以了解发生了什么。一些功能被暂停,因为它们应该有来自需要它的 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)
}

VIEWMODEL

var manufacturers: MutableLiveData<PagedList<WKDA>> = MutableLiveData()

init {
  viewModelScope.launch {
    repository.getManufacturers(manufacturers)
  }
}

存储库

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

我在这里错过了什么?

检查后:正确调用了loadAfter。问题出在模型本身:

wkda.id had always the same "name" value

DiffCallback 将旧对象列表与新对象列表进行了比较,未发现差异,因此项目 "duplicates" 未添加到适配器