将LiveData与数据绑定结合使用

Igo*_*dro 22 android kotlin android-databinding android-mvvm android-architecture-components

随着Android体系结构组件的稳定,我开始将所有基本ViewModel的更新到新的实现ViewModel.根据我的理解,LiveData建议使用它来保存Model类,因为它更好地处理生命周期.

我喜欢使用Data Binding它,因为它使代码在Java/Kotlin方面更清晰,并且不需要"观察"值更改来更新UI.但是,Data Binding如果Model(或ViewModel)扩展BaseObservable,LiveData则仅使用监视数据的布局会发生变化.我理解的主要目标之一LiveData是以编程方式观察和更新UI,但对于简单的更新,Data Binding非常有用.

这个问题已经报道过(GitHubStack Overflow),并且首先说版本1.0会有它,现在据说这个功能正在开发中.

为了同时使用LiveDataData 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
    }
}
Run Code Online (Sandbox Code Playgroud)

所以基本上我ObservableMutableLiveData是一个副本,ObservableField使用LiveData存储模型,并用此实现,每一个模型更新后的布局更新.

问题是:

  • 这是一个糟糕的实施LiveData?这个包装器是否"打破"了LiveData诸如生命周期意识的功能?
  • 在我的理解中,LiveData是新的ObservableField.它是否正确?

Sir*_*lot 18

对于那些遇到这个问题寻找像我一样的例子的人来说,这里有一个:

在布局中.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>
Run Code Online (Sandbox Code Playgroud)

在您的代码中设置它的值和生命周期所有者:

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

...

binding.setLifecycleOwner(this);
binding.setMyString(myString);
Run Code Online (Sandbox Code Playgroud)

而已 :)

请注意,LiveData元素的默认值是null指定初始值以确保您立即获得所需效果或使用此值来强制执行可空性.


Igo*_*dro 12

Android Studio 3.1(目前在Canary 6中)将解决此问题,因为LiveData可以用作observable field:

数据绑定的更新:

您现在可以将LiveData对象用作数据绑定表达式中的可观察字段.ViewDataBinding类现在包含一个新的setLifecycle方法,您需要使用该方法来观察LiveData对象.

来源:Android Studio 3.1 Canary 6现已推出

  • @kyurkchyan添加这个`binding.setLifecycleOwner(this);`https://developer.android.com/topic/libraries/data-binding/architecture#java (5认同)