更新当前页面或更新数据分页3库AndroidKotlin

vulvrdjw  于 2023-01-05  发布在  Kotlin
关注(0)|答案(2)|浏览(174)

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

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

我正在传递列表,这是来自服务器.getStreamData函数返回的项目与int和字符串数据.我的数据类

data class UnlimitData(val id: Int, val name: String)
    • createRepo**正在我的活动类中调用,以便在适配器中发送数据。
lifecycleScope.launch {
        viewModel.createRepo(serverData,repository).collectLatest { data ->
            adapter.submitData(data)
        }
}

这是我的适配器代码:-

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
    }
}

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

o8x7eapl

o8x7eapl1#

为了让分页获得新条目,你需要调用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() }
    }
}
mspsb9vt

mspsb9vt2#

当我们使用adapter.refresh()方法时,它将刷新最新数据并与布局绑定。
但是它不是用位置重新加载回收器视图。在这种情况下,你会得到错误的位置。
因为在DiffUtils中你匹配正确,所以,每当你刷新时,它将只绑定新的和未绑定的数据。
所以,解决办法是你必须使DiffUtils为false。在这种情况下,PageSource将更新整个列表,位置也将被更新。
喜欢:oldItem.id ==-1

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

        override fun areContentsTheSame(oldItem: UnlimitData, newItem: UnlimitData): Boolean = oldItem == newItem
    }

相关问题