【问题标题】:Is there a better way to update recyclerview in paging3 with room?有没有更好的方法来更新 paging3 中的 recyclerview 和房间?
【发布时间】:2021-07-19 08:55:19
【问题描述】:

在我的片段中

            lifecycleScope.launch {
                viewModel.capture().collectLatest {
                    adapter.submitData(it)
                }
            }

现在当我更新 Recyclerview 中的项目时。

repository.update(bean)
db.withTransaction {
    db.dao().update(bean)
    service.update(requestBody)
}

因为我将 paging3 与 remoteMediator 一起使用,例如: 在道:

@Query("SELECT * FROM content ORDER BY ... ")
fun getAll(): PagingSource<Int,Content>

在视图模型中:

fun capture() = repository.captureYiMaFlow()
  

在存储库中:

fun capture()=
    Pager(
        config = PagingConfig(pageSize = 6), 
        remoteMediator = SettingMediator(service, db)) {    
            db.dao().getAll()    
        }.flow

房间会自动更改recyclerview中的物品数据。因此数据库中的数据将被更新。 因为我打电话给service.update(requestBody),所以服务器中的数据会被更新。


但是recyclerview的UI没有改变。我需要关闭fragment再打开,然后UI会改变。(注意recyclerview的数据已经改变。例如:recyclerview的第一项数据是100,我更新为1000 ,然后当我点击项目时,数据是1000,但是UI数据没有改变,它是100...

虽然我可以使用adapter.notifyDataSetChange()来更新UI,但我认为还有其他一些方法可以完成它

【问题讨论】:

  • 提供了尽可能多的数据,并假设您实现了文档中提到的 Remote Mediator,它看起来确实不错,尤其是我缺少的 collectLatest 运算符,并在这里给我带来了问题: stackoverflow.com/questions/67495592/…。通过查看这些信息,我真的想不出任何可能的解决方案,也许在您的项目中添加一个 github 链接?
  • @mehulbisht 这个问题我已经解决了......但我还有另一个问题......
  • 那么这次的问题是什么? :)
  • 我把它放在答案上:如果我改变两行代码的顺序,结果是不同的。 adapter.submitData(it) adapter.notifyDataSetChanged()
  • 好吧,你能展示一下submitData 的实际作用吗?是DIffUtils的方法还是你自己创建的自定义方法?

标签: android kotlin android-room android-jetpack android-paging


【解决方案1】:

在片段中。加adapter.notifyDataSetChanged(),如: 改变

lifecycleScope.launch {
    viewModel.capture().collectLatest {
        adapter.submitData(it)
    }
}

lifecycleScope.launch {
    viewModel.capture().collectLatest {
        adapter.notifyDataSetChanged()
        adapter.submitData(it)
    }
}

以上代码可以解决问题。


但是,如果我更改了这两行代码的顺序,它将无法按预期工作

这意味着如果我使用

lifecycleScope.launch {
    viewModel.capture().collectLatest {
        adapter.submitData(it)
        adapter.notifyDataSetChanged()
    }
}

它不会按预期工作.....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 2019-09-03
    • 2019-01-12
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多