ListView与Adapter之间的观察者模式
本文用文字叙述不太好描述,主要通过下面这张图来表示:
这张图体现出了主要的关系
- 首先创建一个MyAdapter继承BaseAdapter
public class MyAdapter extends BaseAdapter {
private List<String> list;
public MyAdapter(List<String> list) {
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;
}
}
- 给ListView设置适配器
MyAdapter adapter = new MyAdapter();
listView.setAdapter(adapter);
- 通过ListView、BaseAdapter以及相关继承关系的类的源码进行分析
有注释的地方为主要分析部分(主要代码)
//分析主要代码
/************
* ListView.class 中
* class ListView extends AbsListView
*/
public class ListView extends AbsListView{
@Override
public void setAdapter(ListAdapter adapter) { //传入一个adapter
super.setAdapter(adapter);
if (mAdapter != null) { // 适配器不为空时
//分析1
mDataSetObserver = new AdapterDataSetObserver();//在这里实例化一个适配器观察者集合
//分析2
mAdapter.registerDataSetObserver(mDataSetObserver);//给适配器注册一个数据适配器观察者
}
}
}
/************
AbsListView.class 中
*/
public abstract class AbsListView extends AdapterView{
//这两个引用会被ListView继承以及实例化和调用
AdapterDataSetObserver mDataSetObserver;
ListAdapter mAdapter;
//AdapterDataSetObserver为AbsListView的内部类
// "分析1 "作用:实现onChanged() onInvalidated()两个方法
class AdapterDataSetObserver extends AdapterView<ListAdapter>.AdapterDataSetObserver {
@Override
public void onChanged() {
super.onChanged();
if (mFastScroll != null) {
mFastScroll.onSectionsChanged();
}
}
@Override
public void onInvalidated() {
super.onInvalidated();
if (mFastScroll != null) {
mFastScroll.onSectionsChanged();
}
}
}
}
/*********************** Adapter 的相关类
*BaseAdapter.class 中
*/
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
//实例化DataSetObservable()
private final DataSetObservable mDataSetObservable = new DataSetObservable();
private CharSequence[] mAutofillOptions;
public boolean hasStableIds() {
return false;
}
//注册观察者
//"分析2" 时调用
public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}
//注销观察者
public void unregisterDataSetObserver(DataSetObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}
//notify 通知数据改变
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
}
/*****
ListAdapter.class 中
*/
public interface ListAdapter extends Adapter {
public boolean areAllItemsEnabled();
boolean isEnabled(int position);
}
/**********************
*DataSetObservable.class 中
是Observable的子类
可以调用mObservers集合
*/
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.class 中
*/
public abstract class Observable<T> {
//观察者集合 list,用于存放所有的观察者,会被子类调用
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.");
}
//添加进list中
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.");
}
//从list中移除
mObservers.remove(index);
}
}
public void unregisterAll() {
synchronized(mObservers) {
mObservers.clear();
}
}
}