提问者:小点点

从房间数据库获取数据后未更新RecyclerView


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

但是在没有互联网连接的情况下,我使用协程从数据库中获取数据。这里的问题是我成功地从数据库中获取数据,但它没有在适配器中更新。我尝试在获取数据后调用通知数据设置更改,但它仍然没有在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()

}

共1个答案

匿名用户

GlobalScope.启动不是阻塞调用所以你需要等待它完成,然后你可以调用jobViewModel. setJobList(jobList)

您不应该使用全局范围。

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

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