观察者设计模式定义:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
不过,在ListView中主要是一对一的依赖关系
ListView可以看做是一个观察者:
1 调用setAdapter方法:
setAdapter(ListAdapter adapter)
2 把ListView注册成观察者,当数据有变化时,ListView会收到通知
@Override
public void setAdapter(ListAdapter adapter) {
....省略...
mDataSetObserver = new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);
....省略...
}
3 AdapterDataSetObserver是ListView的父类AbsListView的父类AbsListView的内部类,代码如下:
class AdapterDataSetObserver extends DataSetObserver {
private Parcelable mInstanceState = null;
@Override
public void onChanged() {
//更新ListView
}
@Override
public void onInvalidated() {
//更新ListView
}
public void clearSavedState() {
}
}
4 AdapterDataSetObserver的父类DataSetObserver代码如下:
public abstract class DataSetObserver {
public void onChanged() {
// Do nothing
}
public void onInvalidated() {
// Do nothing
}
}
BaseAdapter可以看做是一个被观察者:
1 在setAdapter方法中添加观察者:
mDataSetObserver = new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);
BaseAdapter的registerDataSetObserver方法实现:
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
private final DataSetObservable mDataSetObservable = new DataSetObservable();
//添加一个观察者
public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}
//删除一个观察者
public void unregisterDataSetObserver(DataSetObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}
}
被观察者DataSetObservable代码如下:
public class DataSetObservable extends Observable<DataSetObserver> {
public void notifyChanged() {
synchronized(mObservers) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged();
}
}
}
public void notifyInvalidated() {
synchronized (mObservers) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onInvalidated();
}
}
}
}
DataSetObservable的父类Observable代码如下:
public abstract class Observable<T> {
protected final ArrayList<T> mObservers = new ArrayList<T>();
public void registerObserver(T observer) {
synchronized(mObservers) {
mObservers.add(observer);
}
}
public void unregisterObserver(T observer) {
synchronized(mObservers) {
mObservers.remove(index);
}
}
public void unregisterAll() {
synchronized(mObservers) {
mObservers.clear();
}
}
}