如何使用数据绑定库观察房间数据库中的LiveData更改

第一次实施房间和数据绑定。

在我的ViewModel

 var numberOfClubs = ObservableInt(0) private var clubs: LiveData<List<Club>> = clubDao.getAllClubs() 

然后我尝试在插入到Room数据库后获得clubs.value ,但每次都得到一个KotlinNullPointerException

 fun addClubs() { Observable.fromCallable({ clubDao.insertClubs(listOf(Club(null, "clubName")) }) .subscribeOn(schedulerFacade.computation) .subscribe( { numberOfClubs.set(clubs.value!!.size) <--- Kotlin NPE }, { error -> logWrapper.e("MainViewModel", error.message!!) clubError.set(true) }) } 

在我的XML中,我打电话: android:text="@{viewModel.numberOfClubs}"

由于插入到房间数据库不会导致任何东西被返回,我不能设置numberOfClubs与结果。 我认为clubs应该跟踪变化?

是的,正如你已经发现LiveData是生命周期感知的。 这意味着只要活动所有者在场,就会观察到它。

即使你已经发布了解决方案,你不应该使用! 在所有。

 viewModel.clubs.observe(this, { it?.let { viewModel.numberOfClubs.set(it.size) } ) 

在分配您的收件人列表的大小之前进行空检查是正确的方法。

顺便说一句,如果你想在你的布局中获得物品的大小,你应该使用

 text="@{viewModel.clubsList.size() + ``}" 

并观察一个列表,而不是一个列表大小使用

 val clubsList = ObservableArrayList<..>() viewModel.clubs.observe(this, { it?.let { viewModel.clubsList.set(it) } ) 

是一个LiveData误解从我自己。 为了得到一个LiveData对象开始发射的东西是.observe()它。 由于LiveData是生命周期感知的,因此.observe()最好从FragmentActivity调用,因为它具有对LifecycleOwner的引用,它必须是传递到.observe()的第一个参数。

我可能没有按照最佳做法,因为我从我的Activity ViewModel设置ObservableInt ,但我使用:

 viewModel.clubs .observe(this, Observer { clubs -> viewModel.numberOfClubs.set(clubs!!.size) })