【问题标题】:RecyclerView not updated after fetching data from Room Database从房间数据库获取数据后 RecyclerView 未更新
【发布时间】:2021-02-27 07:46:33
【问题描述】:

在我的应用程序中,我从 api 获取数据并将其保存在房间数据库中。从 api 获取数据并直接在适配器中显示它工作正常。

但如果没有互联网连接,我会使用协程从数据库中获取数据。这里的问题是我成功地从数据库中获取了数据,但它没有在适配器中更新。我尝试在获取数据后调用 notifyDataSetChanged,但它仍然没有在 UI 上显示任何内容。

我还注意到一个奇怪的事情是,如果我在调试模式下运行应用程序并浏览所有代码,它会在调试停止时在适配器中显示列表。

下面是从数据库中获取数据并添加到适配器中的代码。

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    if (isInternetAvailable()) {
        if (jobsList.size == 0) {
            getJobs()
        }
    }else{
        GlobalScope.launch {
            jobsList.addAll(dataBaHelperImpl.getJobs())
        }
        jobsViewModel.setJobsList(jobsList)

    }
}

ViewModel setJobList 方法

fun setJobsList(orderList: ArrayList<Jobs>){
    jobsAdapter.setItems(orderList)
    jobsAdapter.notifyDataSetChanged()

}

【问题讨论】:

  • dataBaHelperImpl.getJobs() 可以移动到 viewmodel 并在那里使用 viewmodelScope。您是使用 livedata 还是 flow 来获取房间?您可以观察片段中的实时数据
  • 实时数据。你能举个例子吗,我是协程新手
  • 看着这个youtube.com/watch?v=B8ppnjGPAGE 应该会有所帮助。

标签: android android-recyclerview android-room android-adapter kotlin-coroutines


【解决方案1】:

GlobalScope.launch 不是阻塞调用所以你需要等待它完成然后你可以调用jobsViewModel.setJobsList(jobsList)

你不应该使用Global Scope

有很多方法可以解决这个问题, 您可以将此调用移至ViewModel 并直接使用viewModelScope.launch 并收听LiveData,因为android 房间内部支持协同例程,您不必提供IO 调度程序。如下所示。

val jobLiveData=MutableLiveData<List<Jobs>>()
fun getJobs() {
    viewModelScope.launch {
        jobLiveData.value= dataBaHelperImpl.getJobs()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多