一、DataSetObserver简介
Observable是观察者模式的典型应用。在Android下,Observable是一个泛型的抽象类,表示一个观察者对象,提供了观察者注册、反注册及清空三个方法。Observable的直接继承者有两个:DataSetObservable和ContentObservable。ContentObservable实现比较复杂,不过功能与DataSetObservable类似,这里只讲解DataSetObservable。DataSetObservable在很多的Adapter中都用到,像BaseAdapter。DataSetObservable使用DataSetObserver实例化了Observable。DataSetObserver表示了一个数据集对象的观察者。
二、DataSetObserver使用方式
1)首先我们新建一个activity,内容是一个button,用于做添加数据的一个按钮,代码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.ObserverActivity">
<Button
android:id="@+id/btnAdd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加"/>
</LinearLayout>
2)第二步我们需要写一个DataSetObserver的子类,DataChageSetObserver,代码也很简单。
class DataChageSetObserver extends DataSetObserver{
@Override
public void onChanged() {
super.onChanged();
for (int i = 0; i <list.size() ; i++) {
Log.i("observer", "onChanged: "+list.get(i));
}
}
@Override
public void onInvalidated() {
super.onInvalidated();
}
}
3)我们需要一个observer,并且需要让我们的数据集去注册一下我们的observer
list=new MyListArray<String>();
observer=new DataChageSetObserver();
list.registerDataSetObserver(observer);
这里MyListArray是ArrayList的子类,因为List没有register方法,我们直接抄写BaseAdapter的代码即可,代码如下
public class MyListArray<T> extends ArrayList<T> {
private final DataSetObservable mDataSetObservable = new DataSetObservable();
public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}
public void unregisterDataSetObserver(DataSetObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
public void notifyDataSetInvalidated() {
mDataSetObservable.notifyInvalidated();
}
}
完整代码
public class ObserverActivity extends AppCompatActivity {
private Button btnAdd;
private MyListArray<String> list;
DataChageSetObserver observer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_observer);
list=new MyListArray<String>();
observer=new DataChageSetObserver();
list.registerDataSetObserver(observer);
initView();
}
private void initView() {
btnAdd = (Button) findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list.add("dafda");
list.notifyDataSetChanged();
}
});
}
class DataChageSetObserver extends DataSetObserver{
@Override
public void onChanged() {
super.onChanged();
for (int i = 0; i <list.size() ; i++) {
Log.i("observer", "onChanged: "+list.get(i));
}
}
@Override
public void onInvalidated() {
super.onInvalidated();
}
}
}
总结
observer主要的方法是注册(register)、数据变化(list.add)、变化后处理(onChanged),这里onChanged是要做增加数据之后该如何处理,BaseAdapter是重新加载可见的数据。我们这里就简单的打印一下log日志。