Android实战积累——DataBinding使用技巧总结(二)
一、BaseObservable
前面通过一个例子简单描述了DataBinding的使用,就上个例子而言存在一个问题。单一的赋值在实际开发中没有任何意义,要实现数据源改变是UI中的显示数据也得发生改变那该怎么做,ListView的数据是通过Adapter提供的,当数据发生改变时,我们通过notifyDatasetChanged通过UI去改变数据,这里面的原理其实就是内容观察者,庆幸的是DataBinding也支持内容观察者,而且使用起来也相当方便!
我们可以通过Observable的方式去通知UI数据已经改变了,当然了,官方为我们提供了更加简便的方式BaseObservable,我们的实体类只需要继承该类,稍做几个操作,就能轻松实现数据变化的通知。如何使用呢? 首先我们的实体类要继承BaseObservale类,第二步在Getter上使用注解@Bindable,第三步,在Setter里调用方法notifyPropertyChanged,第四步,完成。
二、案例
1、首先定义一个实体类StudentBO,并继承BaseObservable
package hlf.com.myapplication;
import android.databinding.BaseObservable;
import android.databinding.Bindable;
/**
* Created by Administrator on 2016/4/3.
*/
public class StudentBO extends BaseObservable {
private String name;
public StudentBO(String name) {
this.name = name;
}
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
//hlf.com.myapplication.BR.name类似于R.java,保存了我们所有变量的引用地址,这里我们使用了name
notifyPropertyChanged(hlf.com.myapplication.BR.name);
}
}
2、布局文件
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data class=".Custom"> //自定义DataBindingUtils.setContentView返回的binding类型的类型
<import type="hlf.com.myapplication.StudentBO" />
<variable
name="stu"
type="StudentBO"/>
<variable
name="click"
type="hlf.com.myapplication.MainActivity" />
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{click.click}"
android:text="@{stu.name}"/>
</layout>
3、Activity
package hlf.com.myapplication;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
/**
* Created by Administrator on 2016/4/3.
*/
public class MainActivity extends AppCompatActivity {
private StudentBO mStu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//类型为布局文件中声明的class=".Custom"
hlf.com.myapplication.Custom binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
mStu = new StudentBO("11111");
binding.setStu(mStu);
//注册监听事件
binding.setClick(this);
}
//重新设定view中的值
public void click(View view) {
mStu.setName("2222");
}
}
发布、、、点击TextView就可以实现事件监听数据源是否改变从而改变UI显示数据
浙公网安备 33010602011771号