更新当前页面或更新分页 3 库中的数据 Android Kotlin

viv*_*odi 5 android kotlin nestedrecyclerview android-paging-library android-paging-3

我是 android kotlin 中分页 3 库的新手。我想要无限数据。所以我发现 Paging 3 库对我的情况很有帮助。我使用PagingSource创建了一个列表。我没有使用 Room。我嵌套了recyclerView。我正在将PagingDataAdapterdiff util用于我的 Recyclerview。我使用了codelab推荐的分页库教程我成功了,没有任何问题。我面临更新项目的困难。我使用分页源创建列表,在列表中我有一些来自服务器的数据。我完全没有任何问题。但是如何更新适配器或通知数据在 reyclerview 中发生了变化。我已经有机制来获取更新的列表。我搜索了如何在某个地方更新适配器,但每个地方都提到使用来自DataSource 的invalidate()数据源用于分页 2对吗?现在,根据Migrate to Paging 3 中的文档,这是在Paging 3 中。我使用 Flow 来检索数据。此代码位于viewmodel类中。

fun createRepo(data: List<String>, repository: RepositoryData): Flow<PagingData<UnlimitData>> {
    return repository.getStreamData(data).cachedIn(viewModelScope)
}
Run Code Online (Sandbox Code Playgroud)

我正在传递来自服务器的列表。getStreamData函数返回带有 int 和 string 数据的项目。我的数据类

data class UnlimitData(val id: Int, val name: String)
Run Code Online (Sandbox Code Playgroud)

createRepo正在调用我的活动类以在 Adpater 中发送数据。

lifecycleScope.launch {
        viewModel.createRepo(serverData,repository).collectLatest { data ->
            adapter.submitData(data)
        }
}
Run Code Online (Sandbox Code Playgroud)

这是我的适配器代码:-

class unlimitedAdapter() :
    PagingDataAdapter<UnlimitData, RecyclerView.ViewHolder>(COMPARATOR) {

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    val item = getItem(position)
    if (item != null) {
        (holder as UnlimitedViewHolder).bind(item)
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return UnlimitedViewHolder.create(parent)
}

companion object {
    private val COMPARATOR = object : DiffUtil.ItemCallback<UnlimitData>() {
        override fun areItemsTheSame(oldItem: UnlimitData, newItem: UnlimitData): Boolean =
            oldItem.id == newItem.id

        override fun areContentsTheSame(oldItem: UnlimitData, newItem: UnlimitData): Boolean = oldItem == newItem
    }
}
Run Code Online (Sandbox Code Playgroud)

}

我添加了使用 RetroFit 在列表中插入/更新数据的逻辑。我的列表已成功更新,但我无法刷新 reyclerview。

提前致谢。

dla*_*lam 4

为了让分页获取新项目,您需要调用PagingSource.invalidate()通知Pager它需要获取新PagingSource页面并重新加载页面。您需要跟踪PagingSource工厂生产的所有数据,并在每次从网络更新支持数据集时使它们失效。

编辑:类似这样,但这是一个非常粗糙的原型

abstract class InvalidatingPagingSourceFactory<K,V> : () -> PagingSource<K,V> {
    private val list = mutableListOf()

    abstract fun create()

    override final fun invoke() {
        create().also { list.add(it) }
    }

    fun invalidate() {
        while (list.isNotEmpty()) { list.removeFirst().invalidate() }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @dlam 你能给我们举个例子,invalidate 是如何工作的吗?老实说,对于初学者来说,如何从图书馆学习和阅读是非常困难的。谢谢 (3认同)