首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在页面3库Android中更新当前页面或更新数据

在页面3库Android中更新当前页面或更新数据
EN

Stack Overflow用户
提问于 2020-11-06 13:57:10
回答 1查看 7.3K关注 0票数 7

我在android kotlin的寻呼3库中是新的。我想要无限的数据。因此,我发现寻呼3库对我的情况很有帮助。我使用PagingSource创建了一个列表。我不是在用房间。我有嵌套的 recyclerView。我在我的回收视图中使用PagingDataAdapterdiff util。我使用了codelab中的分页库推荐教程,并且没有任何问题就成功了。我面临着更新这个项目的困难。我使用分页源来创建列表,而在列表中,我有一些来自服务器的数据。我完全没有问题。但是,如何更新适配器或通知数据已在reyclerview中更改。我已经建立了获取更新列表的机制。我搜索了如何在某些地方更新适配器,但是提到了使用来自DataSource的DataSource的每一个地方。DataSource用于分页2,对吗?现在,按照迁移到寻呼3中的文档,这是在分页3中。我用Flow来检索数据。此代码位于视图模型类中。

代码语言:javascript
复制
fun createRepo(data: List<String>, repository: RepositoryData): Flow<PagingData<UnlimitData>> {
    return repository.getStreamData(data).cachedIn(viewModelScope)
}

我正在通过名单,这是来自塞弗。getStreamData函数返回带有int和string数据的项。我的数据类

代码语言:javascript
复制
data class UnlimitData(val id: Int, val name: String)

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

代码语言:javascript
复制
lifecycleScope.launch {
        viewModel.createRepo(serverData,repository).collectLatest { data ->
            adapter.submitData(data)
        }
}

这是我的适配器代码:-

代码语言:javascript
复制
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。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-11-07 09:35:30

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

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

代码语言:javascript
复制
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() }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64715949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档