如何使用数据绑定库观察房间数据库中的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()
最好从Fragment
或Activity
调用,因为它具有对LifecycleOwner
的引用,它必须是传递到.observe()
的第一个参数。
我可能没有按照最佳做法,因为我从我的Activity
ViewModel
设置ObservableInt
,但我使用:
viewModel.clubs .observe(this, Observer { clubs -> viewModel.numberOfClubs.set(clubs!!.size) })