使用LiveData使用数据绑定

问题描述 投票:20回答:3

随着Android的体系结构组件的稳定,我开始更新我的所有基本ViewModels新实施ofViewModel。在我的理解,LiveData的使用,建议持有Model类,因为它处理生命周期更好。

我喜欢用Data Binding,因为它使得用Java /科特林端的代码更清晰,不需要它“看”的值更改为更新UI。然而,使用Data Binding只有当Model(或视图模型)扩展BaseObservableLiveData不看数据更改的布局。我理解的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
    }
}

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

这些问题是:

  • 这是一个不好的实现LiveData的?这是否包装“休息” LiveData的功能,例如是生命周期感知?
  • 在我的理解,LiveData是新ObservableField。这个对吗?
android kotlin android-databinding android-architecture-components android-mvvm
3个回答
16
投票

对于那些谁碰到这个问题,他们正在寻找一个例子,像我一样,这里有一个:

在布局.xmlLiveData元素与它的类型:

<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所以分配初始值,以确保您得到预期的效果马上或使用this执行空性。


13
投票

而Android 3.1工作室(金丝雀6目前)会解决这个问题,因为LiveData可以作为observable field

更新数据绑定:

现在,您可以在数据使用LiveData对象作为一个观察的领域绑定表达式。该ViewDataBinding类现在包括您需要使用用来观察LiveData对象的新setLifecycle方法。

来源:Android Studio 3.1 Canary 6 is now available


0
投票

对于androidx将是:

androidx.lifecycle.MutableLiveData

<layout>
    <data>
        <variable
            name="myString"
            type="androidx.lifecycle.MutableLiveData&lt;String&gt;"/>
    </data>

    ...

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text='@{myString}'
        ...
     />

    ...

</layout>

而对于科特林:

  val myStr = MutableLiveData<String>()

...

 binding.apply {
            setLifecycleOwner(this)
            this.myString = myStr
        }

祝好运! :)

© www.soinside.com 2019 - 2024. All rights reserved.