9

Androidアーキテクチャコンポーネントの安定化に伴い、すべての基本ViewModelViewModelの新しい実装に更新し始めました。私の理解では、LiveDataの使用は、ライフサイクルをより良く扱うので、Modelクラスを保持することをお勧めします。データバインディングでLiveDataを使用する

私はData Bindingを使いたいのですが、それはJava/Kotlin側でコードがより明確になり、UIを更新するために値の変更を「監視」する必要がないためです。しかし、Data Bindingを使用するレイアウトは、Model(またはViewModel)がBaseObservableおよびLiveDataに拡張されている場合にのみ、データの変更を監視します。私はLiveDataの主な目的の1つが観察され、UIをプログラム的に更新することを理解していますが、簡単な更新のためにはData Bindingが非常に便利です。

この問題は既に報告されており(GitHubおよびStack Overflow)、最初にバージョン1.0にはこれがあり、この機能が開発中であると言われました。

LiveDataData Bindingの両方を使用するためには、私はBaseObservableを拡張するクラスの非常に単純な実装を作成しました:

import android.arch.lifecycle.LiveData 
import android.arch.lifecycle.MutableLiveData 
import android.databinding.BaseObservable 

class ObservableMutableLiveData<T>() : BaseObservable() { 

    private var data: MutableLiveData<T> = MutableLiveData() 

    constructor(data: T) : this() { 
     this.data.value = data 
    } 

    public fun set(value: T) { 
     if (value != data.value) { 
      data.value = value 
      notifyChange() 
     } 
    } 

    public fun get(): T? { 
     return data.value 
    } 

    public fun getObservable(): LiveData<T> { 
     return data 
    } 
} 

そこで、基本的に私ObservableMutableLiveDataがモデルを保存するためにLiveDataを使用してObservableFieldのコピーであり、これには、実装は、すべてのモデル更新後にレイアウトを更新します。

質問は以下のとおりです。これはLiveDataの悪い実装

  • ですか?このラッパーは、ライフサイクルを意識するなど、LiveDataの機能を「中断しますか?
  • 私の理解では、LiveDataは新しいObservableFieldです。これは正しいです? LiveDataobservable fieldとして用いることができるので(現在はカナリー6中)のAndroidメーカー3.1は、この問題を解決します

答えて

6

アップデートデータへのバインディング:

あなたは今LiveDataを使用することができます

をデータバインディング式のオブザーバブルフィールドとしてのオブジェクトです。 ViewDataBindingクラスには、LiveDataオブジェクトを監視するために使用する必要がある新しいsetLifecycleメソッドが追加されました。

出典:Android Studio 3.1 Canary 6 is now available

関連する問題