DataBinding可以让普通对象,变量和集合变成可观察的。这些对象与View绑定后,属性发送变化时会,View会自动进行对应的修改。
基础变量
基础类型支持的变量包括
- ObservableBoolean
- ObservableByte
- ObservableChar
- ObservableShort
- ObservableInt
- ObservableLong
- ObservableFloat
- ObservableDouble
- ObservableParcelable
例子
ObservableField<String> obName = new ObservableField<>();
obName.set("aaa");
binding.setObName(obName);
obName.set("bbb");
<data>
<import type="androidx.databinding.ObservableField" />
<variable
name="obName"
type="ObservableField<String>" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{obName}" />
</LinearLayout>
最终打印的是bbb。说明可观测变量obName在设置值后,TextView自动更新了text。
自定义类
基础BaseObservable,在get方法上添加注解@Bindable
,在set方法中添加notifyPropertyChanged方法。
public class UserBean extends BaseObservable{
private String name;
public UserBean() {
}
public UserBean(String name) {
this.name = name;
}
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
}
xml中正常实用即可
<data>
<variable
name="userBean"
type="com.qianfanyun.lib.recyclerview.UserBean" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userBean.name}" />
</LinearLayout>
UserBean userBean = new UserBean("aaa");
binding.setUserBean(userBean);
userBean.setName("bbb");
显示结果为bbb。
双向绑定
双向绑定值,数据变化时View会改变,View改变时,也会触发数据改变。
上面讲了View单向绑定数据,想要在View变化时让数据也改变,只需要将表达式@{}
改为@={}
<data>
<variable
name="userBean"
type="com.qianfanyun.lib.recyclerview.UserBean" />
<variable
name="handler"
type="com.qianfanyun.databinding.MainActivity.Handler"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={userBean.name}"
android:onClick='@{()->handler.onClick("bbb")}'
/>
</LinearLayout>
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
UserBean userBean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
userBean = new UserBean("aaa");
binding.setHandler(new Handler());
binding.setUserBean(userBean);
}
public class Handler {
public void onClick(String name) {
binding.tvName.setText(name);
Log.d("x", "bean name--->" + userBean.getName());
}
}
最终打印为bbb。确定user的name属性产生了变化。
总结
通过DataBinding,View和数据之间可以实现单向绑定和双向绑定。
网友评论