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 ObservableField
LiveData
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 vonLiveData
, wie Lifecycle-Aware? - In meinem Verständnis ist
LiveData
das neueObservableField
. Ist das richtig?