Использование LiveData с привязкой данных

со стабилизацией компонентов архитектуры Android я начал обновлять все мои основные ViewModels к новой реализации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.

источник: Android Studio 3.1 Канарейка 6 теперь доступно


для тех, кто столкнулся с этим вопросом, ища пример, как я, вот один:

в структуре .xml поставить LiveData элемент с его типа:

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

в вашем наборе кода это значение и владелец жизненного цикла:

MutableLiveData<String> myString = new MutableLiveData<>();

...

binding.setLifecycleOwner(this);
binding.setMyString(myString);

вот именно :)

обратите внимание, что значение по умолчанию LiveData элементов null поэтому назначьте начальные значения, чтобы убедиться, что вы получите желаемый эффект сразу или используйте этой для принудительного исполнения nullability.