ListView专题2---使用观察者模式实现数据更新

观察者设计模式定义:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
不过,在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 {
    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 {
   
    protected final ArrayList mObservers = new ArrayList();

    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();
        }
    }
}

你可能感兴趣的:(ListView专题2---使用观察者模式实现数据更新)