本文主要是介绍浅谈安卓BaseAdapter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一:继承结构
经常用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
欢迎大家留言评论,共同学习进步.
这篇关于浅谈安卓BaseAdapter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!