DataBinding使用(一):布局和binding表达式
DataBinding使用(二):可观察的数据对象
DataBinding使用(三):DataBinding高级使用DataBinding中可观察的对象的作用是当数据发生变化是通知其它对象,和观察者模式差不多。Databinding 提供了三种通知方式来通过JavaBean更新UI,分别是Observable
对象,ObservableFilelds
字段和Observable Cllections
集合,这些数据对象绑定到UI,当数据对象的属性发生变化时,UI也自动更新。
一、JavaBean 继承BaseObservable
public class UserBean extends BaseObservable {
private String name;
private String skill;
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
@Bindable
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
notifyPropertyChanged(BR.skill);
}
}
继承BeanObservable,getter方法添加@Bindable
注解,setter方法内部添加通知notifyPropertyChanged
绑定布局
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.test.databinding.two.data.UserBean"/>
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".two.ObservableActivity">
<TextView
android:id="@+id/tv_name_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:textSize="30sp"
app:layout_constraintRight_toLeftOf="@+id/tv_skill_1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/tv_skill_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.skill}"
android:textSize="30sp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/tv_name_1"
app:layout_constraintTop_toTopOf="parent"/>
<Button android:layout_width="wrap_content"
android:id="@+id/bt_change_1"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="BaseObservable更改数据"
app:layout_constraintTop_toBottomOf="@+id/tv_name_1"
/>
</android.support.constraint.ConstraintLayout>
</layout>
class ObservableActivity : AppCompatActivity() {
private lateinit var activityObservableBinding: ActivityObservableBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityObservableBinding = DataBindingUtil.setContentView(this, R.layout.activity_observable)
var user = UserBean()
user.name = "郭靖"
user.skill = "一箭双雕"
activityObservableBinding.user = user
bt_change.onClick {
if (user.name.equals("郭靖")){
user.name="黄蓉"
user.skill="奇门遁甲"
}else{
user.name = "郭靖"
user.skill = "一箭双雕"
}
}
}
}
二、可观察的字段
ObservableField
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
创建可观察字段
class UserModel {
var name = ObservableField<String>()
var skill = ObservableField<String>()
}
绑定布局
data>
<variable name="model" type="com.test.databinding.two.data.UserModel"/>
</data>
...
<TextView
android:id="@+id/tv_name_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{model.name}"
android:textSize="30sp"
app:layout_constraintTop_toBottomOf="@+id/bt_change_1"
app:layout_constraintRight_toLeftOf="@+id/tv_skill_2"
app:layout_constraintLeft_toLeftOf="parent"
/>
<TextView
android:id="@+id/tv_skill_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{model.skill}"
android:textSize="30sp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/tv_name_2"
app:layout_constraintTop_toBottomOf="@+id/bt_change_1"
/>
<Button android:layout_width="wrap_content"
android:id="@+id/bt_change_2"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="ObservableField更改数据"
app:layout_constraintTop_toBottomOf="@+id/tv_name_2"
/>
var model= UserModel()
model.name.set("东邪")
model.skill.set("碧海潮生")
activityObservableBinding.model=model
bt_change_2.onClick {
if (model.name.get().equals("东邪")){
model.name.set("西毒")
model.skill.set("蛤蟆功")
}else{
model.name.set("东邪")
model.skill.set("碧海潮生")
}
}
三、可观察的集合
使用动态的数据结构更新UI,不需要创建JavaBean,DataBinding 提供了ObservableArrayList
,ObservableArrayMap
两个类的实现
使用方式和ArrayList、HashMap一样,这里以ObservableArrayList
为例
data>
<variable name="list" type="android.databinding.ObservableArrayList<Object>"/>
</data>
...
<TextView
android:id="@+id/tv_name_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{list[0]}"
android:textSize="30sp"
app:layout_constraintTop_toBottomOf="@+id/bt_change_2"
app:layout_constraintRight_toLeftOf="@+id/tv_skill_3"
app:layout_constraintLeft_toLeftOf="parent"
/>
<TextView
android:id="@+id/tv_skill_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{list[1]}"
android:textSize="30sp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/tv_name_3"
app:layout_constraintTop_toBottomOf="@+id/bt_change_2"
/>
<Button android:layout_width="wrap_content"
android:id="@+id/bt_change_3"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="ObservableArray更改数据"
app:layout_constraintTop_toBottomOf="@+id/tv_name_3"
/>
val observableList = ObservableArrayList<Any>()
observableList.add("南帝")
observableList.add("一阳指")
activityObservableBinding.list = observableList
bt_change_3.onClick {
if (observableList[0].equals("南帝")) {
observableList.clear()
observableList.add("北丐")
observableList.add("打狗棒")
} else {
observableList.clear()
observableList.add("南帝")
observableList.add("一阳指")
}
}