一:继承结构
经常用Adapter,今天抽出点时间看看BaseAdapter的源码,抽象类BaseAdapter实现了ListAdapter,SpinnerAdpter接口,ListAdapter和SpinnerAdpter均继承自Adapter接口,组织结构如下图所示:
由于BaseAdapter实现ListAdapter ListAdapter,SpinnerAdpter的时候并没有重写这四个抽象方法,所以转给BaseAdapter的子类去实现.
至于ListAdapter 中只有两个抽象方法:
public boolean areAllItemsEnabled();
boolean isEnabled(int position);
BaseAdapter已经重写这两个方法并且返回true,权限为public,所以我们自己的适配器可以使用这两个方法,决定条目是否Enabled.
最后一个SpinnerAdpter spinner是纺纱工的意思,纺纱工适配器,意思时不断的像纺纱机一样刷新视图.这个适配器只有一个抽象方法:
public View getDropDownView(int position, View convertView, ViewGroup parent);
BaseAdapter 中重写了该方法:
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent);
}
BaseAdapter 中除了四个需要继承者需要实现的方法外,其余Adapter抽象方法均已重写,其中两个方法,
notifyDataSetChanged() 和notifyDataSetInvalidated() 是BaseAdapter自己独有的方法.
二:BaseAdpter数据绑定
BaseAdapter 的数据绑定用到了观察者模式,DataSetObserver,DataSetObservable,Observable
DataSetObserver源码:
public abstract class DataSetObserver {
/**
* 当整个数据集发生更改时调用此方法
*/
public void onChanged() {
// Do nothing
}
/**
* 当整个数据无效时调用此方法
*/
public void onInvalidated() {
// Do nothing
}
DataSetObservable源码:其中用到了synchronized,因为ArrayList是线程不安全的,如果ArrayList换做Vector (线程安全,效率低)也是可以的,此时就不需要synchronized了.
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();
}
}
}
Observable源码:
public abstract class Observable<T> {
protected final ArrayList<T> mObservers = new ArrayList<T>();
/**
*添加观察者
*/
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);
}
}
/**
*移除观察者
*/
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);
}
}
/**
* 移除所有已注册的观察者
*/
public void unregisterAll() {
synchronized(mObservers) {
mObservers.clear();
}
}
}
注释已经翻译为中文.
BaseApter在notifyDataSetChanged()方法中调用:mDataSetObservable.notifyChanged(),当数据发生变化时调用notifyDataSetChanged()方法,刷新视图.
private final DataSetObservable mDataSetObservable = new DataSetObservable();
public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}
public void unregisterDataSetObserver(DataSetObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
public void notifyDataSetInvalidated() {
mDataSetObservable.notifyInvalidated();
}
至此BaseAdapter的组织结构和数据结构已经展示完毕,且看下次分析Adapter如何与ListView 进行绑定,即:setAdapter方法.
BaseAdapter 数据绑定用到了观察者模式,观察者模式可参考我的另一篇博客:
https://blog.csdn.net/startCrazyActivity/article/details/81369196
欢迎大家留言评论,共同学习进步.