AndroidでLiveDataのTransformationsを使ってみた
の続編
次はMediatorLiveDataを使ってみた
・コードの説明
MediatorLiveDataは他のdatasourceの更新を取れる
ただし、MediatorLiveDataのコールバックが呼ばれない問題にぶつかった
これはMediatorLiveDataの購読処理を呼んでないからなので注意
https://stackoverflow.com/questions/52404536/mediatorlivedata-onchanged-not-getting-called
・Main.kt
class MainActivity : AppCompatActivity() {
private val model: NameViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val nameObserver = Observer<String> { newName ->
name_text_view.text = newName
}
// model.currentName.observe(this, nameObserver)
// model.ikemenName.observe(this, nameObserver)
model.mediator.observe(this, nameObserver)
button.setOnClickListener {
val anotherName = "masterka"
model.currentName.postValue(anotherName)
}
}
}
・NameViewModel.kt
class NameViewModel : ViewModel() {
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
// val ikemenName = Transformations.map(currentName) {
// "ikemen: $it"
// }
val mediator = MediatorLiveData<String>()
init {
mediator.addSource(currentName) {
val name = "$it mediator"
mediator.postValue(name)
}
}
}
これでデータの更新をフックして何かの作業を実施することができるようになりましたとさ
関連記事:
- AndroidでLiveDataのTransformationsを使ってみた
- androidでDataBinding + ViewModel + LiveDataを使ってみた
- androidでDataBinding + ViewModel + LiveDataで双方向Bindingしてみた