观察者模式应用在Gridview、Adapter原理解析
来源:互联网 发布:linux中sed命令详解 编辑:程序博客网 时间:2024/06/05 14:37
划分成分:
控件View
GirdView –> AbsListView –> AdapterView
适配器Adapter
BaseAdapter –> Adapter
观察者Observer
AdapterDataSetObserver –> DataSetObserver
被观察者Observable
DataSetObservable –> Observable
场景:GridView中必不可少的Adapter,在我们改变item后,我们都会调用一个方法: notifyDataSetChanged()进行刷新效果,这个方法就是用到了我们所说的观察者模式
思路:在GridView的setAdapter中,外部引入adapter对象,并new出一个观察者对象mDataSetObserver。以adapter为桥梁间接实现观察者、被观察者的订阅–发布。
View部分:
GridView的setAdapter方法
@Override public void setAdapter(ListAdapter adapter) { if (mAdapter != null && mDataSetObserver != null) { mAdapter.unregisterDataSetObserver(mDataSetObserver); } resetList(); mRecycler.clear(); mAdapter = adapter; //代码省略... if (mAdapter != null) { //代码省略... //GridView父类的内部类 mDataSetObserver = new AdapterDataSetObserver();//新的观察者对象 mAdapter.registerDataSetObserver(mDataSetObserver);//注册观察者 //代码省略... } else { //代码省略... } requestLayout(); }
Adapter部分:
BaseAdapter通过DataSetObservable间接实现:1 对观察者的注册、解绑;2 观察者方法调用
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); } /** * 遍历观察者对象 * 当数据集用变化时通知所有观察者 */ public void notifyDataSetChanged() { mDataSetObservable.notifyChanged(); }}
Adapter : BaseAdapter父类
public interface Adapter { /** * 注册 */ void registerDataSetObserver(DataSetObserver observer); /** * 解绑 */ void unregisterDataSetObserver(DataSetObserver observer); //代码省略...}
Observable部分:
Observable实现对观察者集合管理
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>(); /** * 注册观察者observer */ 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); } } /** * 解绑观察者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); } } //代码省略}
DataSetObservable 实现对观察集合遍历,并调用其方法
public class DataSetObservable extends Observable<DataSetObserver> { /** * 遍历观察者集合,执行观察者onChanged()方法 */ public void notifyChanged() { synchronized(mObservers) { // since onChanged() is implemented by the app, it could do anything, including // removing itself from {@link mObservers} - and that could cause problems if // an iterator is used on the ArrayList {@link mObservers}. // to avoid such problems, just march thru the list in the reverse order. for (int i = mObservers.size() - 1; i >= 0; i--) { mObservers.get(i).onChanged();//observer的onChanged() } } } /** * 遍历观察者集合,执行观察者onInvalidated()方法 */ public void notifyInvalidated() { synchronized (mObservers) { for (int i = mObservers.size() - 1; i >= 0; i--) { mObservers.get(i).onInvalidated();//observer的onInvalidated() } } }}
观察者DataSetObserver需要被实现两个方法
public abstract class DataSetObserver { public void onChanged() { // Do nothing } public void onInvalidated() { // Do nothing }}
简单概括:
View
得到adapter和observer,observer注入adapter中;实现observer的方法
Adapter
得到observable和observer,把observer注入到observable
Observable
对observer集合统一管理;对observer方法的触发
参考:http://blog.csdn.net/u012124438/article/details/55294914/
- 观察者模式应用在Gridview、Adapter原理解析
- Adapter模式在STL中的应用
- 浅谈Adapter中观察者模式
- 观察者模式在Java编程中的应用
- 观察者(Observer)模式在Android应用
- 观察者模式在项目中的应用
- 观察者模式在安卓中的应用
- 观察者模式在Android中的应用
- 观察者模式在MVP中的应用
- 观察者模式在电话中的应用
- 观察者模式在交易系统中的应用
- 设计模式系列(1)---观察者模式解析与应用
- Android Adapter原理解析
- 设计模式在游戏中的应用--观察者模式(十)
- 设计模式之观察者模式在Listview中的应用
- 设计模式在游戏开发中的应用之观察者模式
- (转)设计模式之观察者模式在ListView中的应用
- 观察者模式解析
- JavaScript 自定义封装XMLHttpRequest
- 机器学习基本概念
- c语言 两字符串交叉合并
- C语言对图片进行base64编码
- 关于VERIFY_OCTAL_PERMISSIONS权限检查
- 观察者模式应用在Gridview、Adapter原理解析
- linux学习---常用时间函数
- 区间相交问题
- modCount的作用
- PDF转HTML常用方法分享
- 微信小程序开发遇到的坑
- 15.linux内存管理概括
- 记一次安卓适配的解决
- Spring 2.5配置文件详解