studio livedata example developers data android kotlin android-databinding android-architecture-components android-mvvm

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 de LiveData , como ser consciente del ciclo de vida?
  • A mi entender, LiveData es el nuevo ObservableField . ¿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.

Fuente: Android Studio 3.1 Canary 6 ya está disponible


Para Android será:

androidx.lifecycle.MutableLiveData

<layout> <data> <variable name="myString" type="androidx.lifecycle.MutableLiveData;String&gt;"/> </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&lt;String&gt;"/> </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.