android - 有没有更好的方法来更新 paging3 中的 recyclerview 和房间?
问题描述
在我的片段中
lifecycleScope.launch {
viewModel.capture().collectLatest {
adapter.submitData(it)
}
}
现在,当我更新Recyclerview
.
repository.update(bean)
db.withTransaction {
db.dao().update(bean)
service.update(requestBody)
}
因为我将 paging3 与 remoteMediator 一起使用,例如:在 dao 中:
@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,但我认为还有其他一些方法可以完成它
解决方案
在片段中。添加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()
}
}
它不会按预期工作......
推荐阅读
- c# - 如何从字符串数组填充 DataGrid?
- command-line - 如何跟踪使用 Start 命令执行的命令的进度
- tensorflow - 如何将 pytorch Adaptive_avg_pool2d 方法转换为 keras 或 tensorflow
- entity-framework - Visual Studio 2017 实体框架设计器禁用自动提交
- spring - Spring Boot Filter报错,未注册Filter后注册失败
- vhdl - 进程和“香草”VHDL之间的区别
- bash - 无法执行二进制文件:执行格式错误 64 位
- typescript - Visual Code 不断更改 tsconfig.json 中包含的文件
- javascript - 如何将 PHP 变量连接到 HTML 链接中?
- java - 处理 InterruptedException 的最佳实践