多条目控件AdapterView是仿MVC设计模式进行设计的,即AdapterView与数据是分离的,AdapterView并不直接操作数据,而是利用中间件适配器Adapter,实际上,完整的AdapterView显示是三个逻辑部分:AdapterView+Adapter+Data,Adapter相当于MVC中的控制器C,AdapterView相当于MVC中的视图V,顺便说一句,Android程序设计,也是利用MVC控制模式。既然视图与数据是分离的,那么当数据有更新时,视图显然无法自动更新,Adapter必须实时监控数据变化并刷新视图,这里用到的是Observer(观察者模式)。
一、什么是观察者模式
所谓观察者模式,听起来很复杂高大上,实际上响应过程就如同一个点击事件处理过程(实际上也是按照观察者模式处理,但形式上有所改变),比如一个Button和一个监听器,Button就是被观察者(T extends Observable),监听器就是观察者(T extends DataSetObservable),当Button状态发生变化时,被观察者“贱贱”的向观察者发出通知,告知其状态改变,然后观察者做出相应的处理。观察者模式比较容易混淆的就是这个“贱贱”,并不是观察者主动观察得知被观察者发生变化,而是被动的等待再作相应的处理。
为实现观察者模式,Android设计两个抽象类,分别是DataSetObserver及Observable(可观察的,即被观察者),从英文字面上就直观看出谁是观察者,谁是被观察者。下面对此详细介绍。
二、DataSetObserver(观察者)抽象类与Observable(被观察者)抽象类继承体系
1、DataSetObserver
DataSetObserver类的API这样描述:DataSetObserver(观察者)通常设置给Cursor或Adapter,如果数据发生变化则回调该类方法。DataSetObserver类无法单独调用,必须配合DataSetObservable类使用。该类的实例即是Observer,观察者的刷新视图行为是由onChanged以及onInvalidated方法决定的,通常在AdapterView控件,如ListView中继承该类,并通过重写这两个方法,实现针对性的视图刷新。
public abstract class DataSetObserver {
//当被观察的数据发生变化,回调该函数
public void onChanged()
//当被观察的数据失效,回调该函数
public void onInvalidated()
<span style="font-family: FangSong_GB2312; font-weight: bold; background-color: rgb(255, 255, 255);">2、Observable(被观察者)抽象类继承体系</span>