首页 > 解决方案 > 有没有更好的方法来更新 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,但我认为还有其他一些方法可以完成它

标签: androidkotlinandroid-roomandroid-jetpackandroid-paging

解决方案


在片段中。添加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()
    }
}

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


推荐阅读