源码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差不多就是这么个逻辑。

源码学习中








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值