随着Android的体系结构组件的稳定,我开始更新我的所有基本ViewModel
s新实施ofViewModel
。在我的理解,LiveData
的使用,建议持有Model
类,因为它处理生命周期更好。
我喜欢用Data Binding
,因为它使得用Java /科特林端的代码更清晰,不需要它“看”的值更改为更新UI。然而,使用Data Binding
只有当Model
(或视图模型)扩展BaseObservable
和LiveData
不看数据更改的布局。我理解的LiveData
的主要目标之一是观察和编程方式更新UI但对于简单的更新,Data Binding
是非常有用的。
这个问题已经报道(GitHub和Stack Overflow),并首次表示,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
。这个对吗?对于那些谁碰到这个问题,他们正在寻找一个例子,像我一样,这里有一个:
在布局.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
所以分配初始值,以确保您得到预期的效果马上或使用this执行空性。
而Android 3.1工作室(金丝雀6目前)会解决这个问题,因为LiveData
可以作为observable field
:
更新数据绑定:
现在,您可以在数据使用LiveData对象作为一个观察的领域绑定表达式。该ViewDataBinding类现在包括您需要使用用来观察LiveData对象的新setLifecycle方法。
对于androidx将是:
androidx.lifecycle.MutableLiveData
<layout>
<data>
<variable
name="myString"
type="androidx.lifecycle.MutableLiveData<String>"/>
</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
}
祝好运! :)