android - example - Usando LiveData con enlace de datos
mutable live data android (3)
Con la estabilización de los componentes de la arquitectura de Android, comencé a actualizar todos mis ViewModel
básicos a la nueva implementación de ViewModel
. En mi entendimiento, se recomienda el uso de LiveData
para mantener la clase de Model
, ya que maneja mejor el ciclo de vida.
Me gusta usar el Data Binding
porque aclara el código en Java / Kotlin y no es necesario "observar" los cambios de valor para actualizar la interfaz de usuario. Sin embargo, el diseño que utiliza el Data Binding
solo ve los cambios de datos si el Model
(o el modelo de visualización) amplía la base de BaseObservable
y LiveData
no. Entiendo que uno de los principales objetivos de LiveData
es ser observado y actualizar la interfaz de usuario programáticamente, pero para actualizaciones simples, el Data Binding
es muy útil.
Este problema ya se informó ( GitHub y Stack Overflow ) y primero se dijo que la versión 1.0 lo tendría y ahora se dice que esta característica está en desarrollo.
Para usar LiveData
y Data Binding
, creé una implementación muy simple de la clase que extiende 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
}
}
Básicamente, mi ObservableMutableLiveData
es una copia de ObservableField
usa LiveData
para almacenar el modelo y, con esta implementación, el diseño se actualiza después de cada actualización del modelo.
Las preguntas son:
- ¿Es esta una mala implementación de
LiveData
? ¿Esta envoltura "rompe" las funcionalidades deLiveData
, como ser consciente del ciclo de vida? - A mi entender,
LiveData
es el nuevoObservableField
. ¿Es esto correcto?
El Android Studio 3.1 (actualmente en Canary 6) solucionará este problema, ya que LiveData
puede usarse como observable field
:
Actualizaciones de enlace de datos:
Ahora puede usar un objeto LiveData como un campo observable en expresiones de enlace de datos. La clase ViewDataBinding ahora incluye un nuevo método setLifecycle que debe usar para observar los objetos LiveData.
Para Android será:
androidx.lifecycle.MutableLiveData
<layout>
<data>
<variable
name="myString"
type="androidx.lifecycle.MutableLiveData;String>"/>
</data>
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=''@{myString}''
...
/>
...
</layout>
Y para Kotlin:
val myStr = MutableLiveData<String>()
...
binding.apply {
setLifecycleOwner(this)
this.myString = myStr
}
¡Buena suerte! :)
Para aquellos que se encontraron con esta pregunta buscando un ejemplo como el que hice, aquí hay uno:
En layout .xml
pon el elemento LiveData
con su tipo:
<layout>
<data>
<variable
name="myString"
type="android.arch.lifecycle.MutableLiveData<String>"/>
</data>
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=''@{myString}''
...
/>
...
</layout>
En su conjunto de códigos es el valor y el propietario del ciclo de vida:
MutableLiveData<String> myString = new MutableLiveData<>();
...
binding.setLifecycleOwner(this);
binding.setMyString(myString);
Eso es :)
Tenga en cuenta que el valor predeterminado de los elementos de LiveData
es null
así que asigne valores iniciales para asegurarse de que obtiene el efecto deseado de inmediato o use this para imponer la nulabilidad.