9

Mit der Stabilisierung von Android Architecture Components habe ich begonnen, alle meine grundlegenden ViewModel s auf die neue Implementierung von ViewModel zu aktualisieren. In meinem Verständnis wird die Verwendung von LiveData empfohlen, um die Klasse zu halten, da es den Lebenszyklus besser behandelt.Verwenden von LiveData mit Datenbindung

Ich mag die Verwendung Data Binding, weil es den Code in Java/Kotlin Seite klarer macht und es nicht notwendig ist, die Wertänderungen zu "beobachten", um die UI zu aktualisieren. Das Layout, das Data Binding verwendet, ändert jedoch nur Daten, wenn das Model (oder das ViewModel) BaseObservable und LiveData nicht erweitert. Ich verstehe, dass eine der Hauptziele von LiveData zu beachten ist und die Benutzeroberfläche programmgesteuert aktualisiert, aber für einfache Updates ist Data Binding sehr nützlich.

Dieses Problem wurde bereits gemeldet (GitHub und Stack Overflow) und zuerst wurde gesagt, dass die Version 1.0 hätte es und jetzt wird gesagt, dass diese Funktion in der Entwicklung ist.

Um sowohl LiveData und Data Binding zu verwenden, habe ich eine sehr einfache Implementierung von Klasse, die BaseObservable erweitert:

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

mein Also im Grunde ObservableMutableLiveData ist eine Kopie von ObservableFieldLiveData mit Hilfe des Modells zu speichern und mit diesem Implementation wird das Layout nach jedem Modellupdate aktualisiert.

Die Fragen sind:

  • Ist das eine schlechte Implementierung von LiveData? Zerbricht dieser Wrapper die Funktionalitäten von LiveData, wie Lifecycle-Aware?
  • In meinem Verständnis ist LiveData das neue ObservableField. Ist das richtig?

Antwort

6

Das Android Studio 3.1 (in Canary 6 zur Zeit) wird dieses Problem beheben, da LiveData als observable field verwendet werden:

Updates für Datenbindung:

Sie jetzt einen Livedata verwenden können Objekt als beobachtbares Feld in Datenbindungsausdrücken. Die ViewDataBinding-Klasse enthält jetzt eine neue setLifecycle-Methode, die Sie zum Beobachten von LiveData-Objekten verwenden müssen.

Quelle: Android Studio 3.1 Canary 6 is now available