Skip to main content

AndroidでLiveDataのMediatorLiveDataを使ってみた

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)
        }
    }
}

 

これでデータの更新をフックして何かの作業を実施することができるようになりましたとさ

関連記事:

Pocket