ListView專題2---使用觀察者模式實現(xiàn)數(shù)據(jù)更新

觀察者設(shè)計模式定義:
觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。
這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
不過,在ListView中主要是一對一的依賴關(guān)系
ListView可以看做是一個觀察者:
1 調(diào)用setAdapter方法:
setAdapter(ListAdapter adapter) 
2 把ListView注冊成觀察者,當數(shù)據(jù)有變化時,ListView會收到通知
@Override
public void setAdapter(ListAdapter adapter) {
        ....省略...
        mDataSetObserver = new AdapterDataSetObserver();
        mAdapter.registerDataSetObserver(mDataSetObserver);
        ....省略...
}
3 AdapterDataSetObserver是ListView的父類AbsListView的父類AbsListView的內(nèi)部類,代碼如下:
 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方法實現(xiàn):
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();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容