〈kotlin〉MVVM③ LiveData

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。

LiveData

ViewModel内でのデータの保存にLiveDataを使うことで
ライフサイクルに応じたデータの監視が可能になる。
(値が変更されたらその変更が検知されてUI上のデータも自動で変わる。)

実装

build.gradle
dependencies{
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0"
}
LiveDataオブジェクトの作成

ViewModelにLiveDataオブジェクトを作成する。

class ViewModelSample : ViewModel(){
    //バッキングプロパティを使う
    //内部で使用する変更可能なMutableLiveData
    private val _sampleData : MutableLiveData<String> = MutableLiveData<String>()

    //外部から参照するLiveData
    val sampleData : LiveData<String> = _sampleData

    //MutableLieDataを使って値を変更する処理を作成
    fun setSampleData(){
        _sampleData.value = "Sample"
        //LiveDataオブジェクトのデータにアクセスする時はvalueを使用
    }
}
LiveDataオブジェクトの監視

LiveDataが変更された時の処理を管理するObserverオブジェクトを作成する。
これをobserve() メソッドを使用して LiveData オブジェクトにアタッチすることで、
Observer オブジェクトが LiveDataに登録され、変更が通知されるようになる。

class MainActivity : AppCompatActivity() {
     private val model: ViewModelSample by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ....

        val observer = Observer<String> { data ->
            dataTextView.text = data
            //データ変更時の処理
        }

        model.sampleData.observe(this, observer)
        //fragmentで使用するときはthisをviewLifecycleOwnerにする
    }
}
Databindingと一緒に使う

observe() メソッドは LifecycleOwnerと変更時の処理をLiveDataに設定しているが、
DataBindingと一緒に使う時はLifecycleOwnerを最初に設定し、変更時の処理はxmlファイルに直接記載する。
(上記のobserve()メソッドの部分が不要になる)

class MainActivity : AppCompatActivity() {
     private val model: ViewModelSample by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.lifecycleOwner = this
        binding.viewModel = model
    }
}


参考https://developer.android.com/topic/libraries/architecture/livedata