浅谈安卓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

欢迎大家留言评论,共同学习进步.

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值