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

源码学习中








相关文章
|
Android开发
ListView和ArrayAdapter、SimpleAdapter适配器的简单使用
ListView和ArrayAdapter、SimpleAdapter适配器的简单使用
|
XML Java Android开发
Android——RecyclerView简单实现及Viewbinding优化
本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习。
430 0
|
XML 缓存 数据格式
BaseAdapter 优化
学习ListView的优化很重要,而本节针对的是BaseAdapter的优化,优化的两点有,复用convertView 以及使用ViewHolder重用组件,不用每次都findViewById,我们具体通过代码来体会吧。
|
Android开发 Java 数据格式
DialogFragment源码分析
目录介绍 1.最简单的使用方法 1.1 官方建议 1.2 最简单的使用方法 1.3 DialogFragment做屏幕适配 2.源码分析 2.1 DialogFragment继承Fragment 2.
1185 0
|
Java 容器
【RecyclerView】二、RecyclerView 简介 ( RecyclerView 特点 | RecyclerView 涉及到的类 )
【RecyclerView】二、RecyclerView 简介 ( RecyclerView 特点 | RecyclerView 涉及到的类 )
191 0
|
Java Android开发
PopupWindow源码分析
目录介绍 1.最简单的创建方法 1.1 PopupWindow构造方法 1.2 显示PopupWindow 1.3 最简单的创建 1.4 注意问题宽和高属性 2.源码分析 2.1 setContentView(View contentView) 2.
1824 0
|
Android开发
Android开发技巧——BaseAdapter的另一种优雅封装
RecyclerView虽然因其灵活性、高效性等特点而备受好评,但也不是一定得用它把ListView给替代掉。在某些场景中,ListView还是相对更适合的。比如数据量不大,不频繁更新,并且需要简单地设置一下divider或header、footer的时候,相对于RecyclerView的繁琐,ListView在实现上则表现得更方便和简洁。
1095 0