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

源码学习中








上一篇:部署在SAP Cloud Platform CloudFoundry环境的应用如何消费SAP Leonardo机器学习API


下一篇:[flask]异常处理,请求钩子