最近做項目,閑來無聊打算自定義一個listadapter,一般常用的是繼承baseadapter來實作裡面的方法。我打算自己定義一個adapter深入學習adapter.
點開adapter的api文檔,發現裡面有一個
void registerDataSetObserver(DataSetObserver observer);
方法,遂跟下去看看DataSetObserver點開發現,
public class DataSetObservable extends Observable<DataSetObserver>
繼承的是Observable觀察者模式,DataSetObserver正是被觀察者。點開Observable的api如下
package android.database;
import java.util.ArrayList;
/**
* Provides methods for registering or unregistering arbitrary observers in an {@link ArrayList}.
*
* This abstract class is intended to be subclassed and specialized to maintain
* a registry of observers of specific types and dispatch notifications to them.
*
* @param T The observer type.
*/
public abstract class Observable<T> {
/**
* The list of observers. An observer can be in the list at most
* once and will never be null.
*/
protected final ArrayList<T> mObservers = new ArrayList<T>();
/**
* Adds an observer to the list. The observer cannot be null and it must not already
* be registered.
* @param observer the observer to register
* @throws IllegalArgumentException the observer is null
* @throws IllegalStateException the observer is already registered
*/
public void registerObserver(T observer) {
if (observer == null) {
throw new IllegalArgumentException("The observer is null.");
}
synchronized(mObservers) {
if (mObservers.contains(observer)) {
throw new IllegalStateException("Observer " + observer + " is already registered.");
}
mObservers.add(observer);
}
}
/**
* Removes a previously registered observer. The observer must not be null and it
* must already have been registered.
* @param observer the observer to unregister
* @throws IllegalArgumentException the observer is null
* @throws IllegalStateException the observer is not yet registered
*/
public void unregisterObserver(T observer) {
if (observer == null) {
throw new IllegalArgumentException("The observer is null.");
}
synchronized(mObservers) {
int index = mObservers.indexOf(observer);
if (index == -1) {
throw new IllegalStateException("Observer " + observer + " was not registered.");
}
mObservers.remove(index);
}
}
/**
* Remove all registered observers.
*/
public void unregisterAll() {
synchronized(mObservers) {
mObservers.clear();
}
}
}
觀察者模式定義:“定義對象間的一種一對多的依賴關系,當一個對象的狀态發生改變的時候,所有依賴于它的對象都将得到通知,并自動更新”,這就是所謂的觀察者模式,照意思了解那麼就一定會有觀察者和被觀察者了,在Java1.2之後,提供了兩個類,即Observable被觀察者,Observer觀察者;
觀察者模式是軟體設計模式的一種。在此種模式中,一個目标物件管理所有相依于它的觀察者物件,并且在它本身的狀态改變時主動發出通知。
實作過程:“注冊——通知——撤銷注冊”
1、觀察者
(Observer)将自己注冊到被觀察對象(Subject)中,被觀察對象将觀察者存放在一個容器(Container)裡。
2、被觀察對象
被觀察對象發生了某種變化,從容器中得到所有注冊過的觀察者,将變化通知觀察者。
在我們的BaseAdapter中,由于繼承了ListAdapter,ListAdapter繼承了Adapter,
是以BaseAdapter實作了registerDataSetObserver注冊觀察者
private final DataSetObservable mDataSetObservable = new DataSetObservable();
public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}
而當我們的DataSetObserver被觀察者的資料發生變化時調用,
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
方法更新資料。也就是調用了DataSetObservable的notifyChanged方法。
先了解到這裡,繼續做項目。