源码BaseAdapter浅谈

BaseAdapter是一个抽象类,他 实现了listAdapter 跟spinnerAdapter俩个接口

listAdapter是继承了Adapter这个接口
在adapter里边有
  void registerDataSetObserver(DataSetObserver observer);//注册观察者模式,对数据进行监听

  void unregisterDataSetObserver(DataSetObserver observer);//注销观察者模式

  int getCount(); 
  
  Object getItem(int position);

  long getItemId(int position);

  boolean hasStableIds();
    
  View getView(int position, View convertView, ViewGroup parent); //返回一个View视图

  static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;//忽略item视图类型
    
  int getItemViewType(int position);  //获取item视图的类型
    
  int getViewTypeCount();   
    
  static final int NO_SELECTION = Integer.MIN_VALUE; 
 
  boolean isEmpty(); //判断这个adapter是不是没有数据,为了确定空的View是否要显示,一个正常类型的实现getCount返回值是== 0,但是getCount还会包含headers和footers,所有需要这个来判断
这几个方法,而在listAdapter里边又添加了俩个方法
   一个是     boolean isEnabled(int position);//是否可以点击,通过这个可以让特定的item不能点击
   一个是      public boolean areAllItemsEnabled();//是否所有的item都能点击

SpinnerAdapter 里边只是添加了一个方法
  public View getDropDownView(int position, View convertView, ViewGroup parent);
在baseadapter通过private final DataSetObservable mDataSetObservable = new DataSetObservable();
这个对象来进行数据变化的监听,但是必须是在我们注册了这个观察者监听以后才能通过监听来刷新数据,注册这个方法在Adapter里边
  而在这抽象类里边有我们比较熟悉的
  public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }
这俩个方法,我们通过观察者对象来进行数据刷新。

   那么注册时在什么时候呢,看下listView的setAdapter这个方法
 @Override
    public void setAdapter(ListAdapter adapter) {
        if (null != mAdapter) {
            mAdapter.unregisterDataSetObserver(mDataSetObserver);
        }

        resetList();
        mRecycler.clear();

        if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
            mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
        } else {
            mAdapter = adapter;
        }

        mOldSelectedPosition = INVALID_POSITION;
        mOldSelectedRowId = INVALID_ROW_ID;
        if (mAdapter != null) {
            mAreAllItemsSelectable = mAdapter.areAllItemsEnabled();
            mOldItemCount = mItemCount;
            mItemCount = mAdapter.getCount();
            checkFocus();

            mDataSetObserver = new AdapterDataSetObserver();
            mAdapter.registerDataSetObserver(mDataSetObserver);

            mRecycler.setViewTypeCount(mAdapter.getViewTypeCount());

            int position;
            if (mStackFromBottom) {
                position = lookForSelectablePosition(mItemCount - 1, false);
            } else {
                position = lookForSelectablePosition(0, true);
            }
            setSelectedPositionInt(position);
            setNextSelectedPositionInt(position);

            if (mItemCount == 0) {
                // Nothing selected
                checkSelectionChanged();
            }

        } else {
            mAreAllItemsSelectable = true;
            checkFocus();
            // Nothing selected
            checkSelectionChanged();
        }

        if (mCheckStates != null) {
            mCheckStates.clear();
        }

        requestLayout();
    }

这个方法里边我们只看最重要的几句,就是我们会给他进行观察者的注册,然后就可以及时的刷新数据了。

整个Adapter差不多就是这么个逻辑。

源码学习中

时间: 2024-08-31 02:23:40

源码BaseAdapter浅谈的相关文章

往昔源码站今何在-谈源码下载的细分

很早之前就想写这样一篇文章,可惜搜索不到以前的源码排行了,记得2003年末开始有这样的源码排行,几经修改,很多人在发布的时候,增加上自己的地址,也许这是源码下载站的站长们最开始的软文途径. Chinaz由03版的第二名无可厚非的成为了源码下载站的第一名,虽然他的不足人人都可以说出一点,但是至今能够超越CHINAZ的还未出现,你可以不尊重CHINAZ,但是谁都不可否认,那曾经是一批初级站长成长的地方,包括本人.谁都不可能否认阿飞的成绩,也不可能否定顽石5年如一日的默默更新,CHINAZ的成功也许占

浅谈源码建站的利与弊

中介交易 SEO诊断 淘宝客 云主机 技术大厅 利用网站源码或者CMS来建站,有人提倡,也有人反对,提倡的当然是较认同源码建站的优点,反对的理由则可能很多很多.站在不同的角度来考虑问题,结论自然就不一样,所以这也很正常. 凡事有其利,必定有其弊.看待事物总是需要从多方面去考察而不能从单一的现象或者因素去分析.对待利用源码建站这一建站这事上,同样也是这样,我们需要持正确的态度来对待它,既要看到它的优点,同时也要正视它存在的问题.所以,在这儿,华夏源码网浅谈一下我们对源码建站的利与弊. 要弄清楚这个

浅谈 jQuery 事件源码定位问题_jquery

昨天群里有人问了个事件源码定位的问题,简单描述下是这样的. 在一个不是自己写的页面上,如何快速定位到他绑定的事件代码在哪?(页面用的是jQuery) 这个问题,说难不难,说简单也没那么简单,万一用的是委托之类也会麻烦点. 在 chrome 的控制台里有个 Event Listeners,这里会显示你所选择元素的事件,如果是原生事件,他会直接显示, 你点击一下事件就会跳到对应代码里了,可是 jQuery 绑定的事件却不是这样的,你点击后只会跳到 jQuery 源码里, min后的jQuery源码密

浅谈struts2之chain[2]

      上午写了<<浅谈struts2之chain[1]>>,现在接着写下半部分:从源码的角度谈chain的机制 因为我的源码全是通过反编译jar包得来,不能保证100%的正确性,若遇到不对的地方,请大家指出.也请大家先谅解 在<<浅谈struts2之chain[1]>>最后,用了一个简略图来表示chain机制: 但实际上,如果考虑valuestack的话,这幅图应该这样画: 对于此图中,关键性两个步骤:5和6, 实际上涉及到两个拦截器: 1)chain

Apache Spark源码走读(十一)浅谈mllib中线性回归的算法实现&amp;Spark MLLib中拟牛顿法L-BFGS的源码实现

<一>浅谈mllib中线性回归的算法实现 概要 本文简要描述线性回归算法在Spark MLLib中的具体实现,涉及线性回归算法本身及线性回归并行处理的理论基础,然后对代码实现部分进行走读. 线性回归模型 机器学习算法是的主要目的是找到最能够对数据做出合理解释的模型,这个模型是假设函数,一步步的推导基本遵循这样的思路 假设函数 为了找到最好的假设函数,需要找到合理的评估标准,一般来说使用损失函数来做为评估标准 根据损失函数推出目标函数 现在问题转换成为如何找到目标函数的最优解,也就是目标函数的最

浅谈bootstrap源码分析之tab(选项卡)_javascript技巧

实现tab选项卡的应用,此插件相对比较简单 源码文件: tab.js 实现原理 1.单击一个元素时,首先将原来高亮的元素取消 2.然后给被单击元素进行高亮 3.如果单击元素是下拉框中某个选项,则选中本身,还要选中下拉框 5.如果定义了动画,先执行动画,然后回调 源码分析: 1.Show方法,是在单击一个元素的时候触发,会触发如下四个事件 1.1.Hiden.bs.tab:隐藏上一个元素 1.2.Show.bs.tab:显示当前元素 1.3.Hideen.bs.tab:隐藏上一个元素完成 1.4.

浅谈bootstrap源码分析之scrollspy(滚动侦听)_javascript技巧

源码文件: Scrollspy.js 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项 2.导航必须是 .nav > li > a 结构,并且a上href或data-target要绑定hashkey 3.菜单上必须有.nav样式 4.滚动区域的data-target与导航父级Id(一定是父级)要一致 <div id="selector" class="navbar navbar-default">

浅谈网站源码与SEO之间的关系

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 众所周知,目前我们建站已经有越来越多的开源程序了,像CMS里有织梦.帝国.PHP168等,论坛用的Discuz.PHPWIND等,博客里的Zblog.wordpss等等吧,这些都提供用户免费下载使用,这只是几款比较知名的程序,当然还有很多不知名的程序,对我们草根站长而言,目前的这些开源程序已经足够我们选择和使用了,究竟选择什么样的源码建站,目

浅谈今后源码类网站应该如何运营

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 如今A5论坛中有多家源码论坛在进行激烈的竞争,如何在这种竞争中脱颖而出是最令我头痛的问题,这个项目是我在两个月之前开始着手策划,其实源码类的网站在很早以前却实非常赚钱,比如说我们熟知的搜虎论坛,终生VIP会员要600元,但是却卖得非常好,源码比别网站其实都是半斤八两,但是这就是品牌效益.现在源码类网站如雨后春笋一般,越来越不赚钱了. 然而我现