觀察者設(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ù)。