0

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

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

解决方案1getItem内部调用onBindViewHolder

submitList解决方案2:调用PagedListAdapter

解决方案3:替换ListAdapterPagedListAdapter

我认为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)
}

视图模型

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

我在这里想念什么?

4

1 回答 1

1

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

wkda.id 始终具有相同的“名称”值

DiffCallback 将旧的对象列表与新的对象列表进行比较,没有发现差异,因此“重复”项没有添加到适配器中

于 2019-07-21T13:56:29.330 回答