LiveDataでListを扱う際に,どの場合にObserverに通知が飛ぶのか不明確であったので調査しました.記事としては沢山ありそうなので備忘録です.
以下のようにViewModelでLiveDataを定義しているとします
val testLiveData = MutableLiveData<MutableList<String>>(mutableListOf())
①LiveDataのListに変更を加えたとき
通知されません.
viewModel.testLiveData.value?.add("test")
②LiveDataのListを置き換えた場合
通知されます
val data = viewModel.testLiveData.value data?.add("test") viewModel.testLiveData.postValue(data)
③LiveDataのListを同一のインスタンスで置き換えた場合
通知されます.インスタンスの同一性については特にチェックされていません
viewModel.testLiveData.postValue(viewModel.testLiveData.value)
まとめ
以上から,発火点はpostValue,setValueを実施した時,ということが分かりました.これで安心して実装できます.
(補足)MutableLiveDataとLiveDataの使いどころ
MutableLiveDataはviewModel内で使用し,viewModel以外で使用する(監視させる)際にはLiveDataとして公開します.こうすることで所定のLiveDataが不用意にUIレイヤーで変更されることを防止できます.
LiveData overview | Android Developers
Use LiveData to handle data in a lifecycle-aware fashion.