Использование LiveData с привязкой данных
со стабилизацией компонентов архитектуры Android я начал обновлять все мои основные ViewModel
s к новой реализацииViewModel
. В моем понимании, использование LiveData
рекомендуется провести Model
класс, так как он лучше обрабатывает жизненный цикл.
мне нравится использовать Data Binding
потому что это делает код более ясным на стороне Java/Kotlin, и не нужно "смотреть" изменения значения для обновления пользовательского интерфейса. Однако макет с использованием Data Binding
только смотреть изменения данных, если Model
(или ViewModel) расширяет BaseObservable
и LiveData
нет. Я понимаю одну из главных целей LiveData
следует наблюдать и обновлять пользовательский интерфейс программно, но для простых обновлений,Data Binding
очень полезно.
об этой проблеме уже сообщалось (GitHub и Переполнение Стека) и сначала было сказано, что версия 1.0 будет иметь его, и теперь говорится, что эта функция находится в развитие.
для того, чтобы использовать как LiveData
и Data 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
- копия ObservableField
используя LiveData
чтобы сохранить модель и с этой реализацией, макет обновляется после каждого обновления модели.
вопросы:
- это плохая реализация
LiveData
? Эта обертка "ломает" функцииLiveData
, например, быть в курсе жизненного цикла? - в моем понимании,
LiveData
новаяObservableField
. Правильно ли это?
2 ответов
Android Studio 3.1 (В настоящее время в Canary 6) исправит эту проблему, так как LiveData
может использоваться как observable field
:
обновления для привязки данных:
теперь можно использовать объект LiveData в качестве наблюдаемого поля в выражениях привязки данных. Класс ViewDataBinding теперь включает новый метод setLifecycle, который необходимо использовать для наблюдения объектов LiveData.
для тех, кто столкнулся с этим вопросом, ища пример, как я, вот один:
в структуре .xml
поставить LiveData
элемент с его типа:
<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>
в вашем наборе кода это значение и владелец жизненного цикла:
MutableLiveData<String> myString = new MutableLiveData<>();
...
binding.setLifecycleOwner(this);
binding.setMyString(myString);
вот именно :)
обратите внимание, что значение по умолчанию LiveData
элементов null
поэтому назначьте начальные значения, чтобы убедиться, что вы получите желаемый эффект сразу или используйте этой для принудительного исполнения nullability.