Android Adapter 源码笔记(1)

  1. Adapter, Android中最常见和明显的设计模式运用,Android中的Adapter主要指的是负责适配AdapterView和Data之间的adapter,可以认为是MVC中的V. Android的Adapter家族还是挺庞大的,base 接口就是Adapter Interface,还和之前一样,一个Interface的源码阅读的价值主要在于基本接口使用guide/抽象设计理念/注释中的要点. Adapter的灵活性极高,很多著名的Android list类开源控件就是在这上面玩花样.

  2. getCount(),没啥多解释的,就是返回Data set中有多少份Item,注意的是,这个函数完全是由调用者自己决定细节的,因此返回多少个Item完全是你说了算的,没必要data set有N个,getCount()就一定老老实实的返回N个(当然了,一般是应该返回N的),一个例子,Adapter的getCount()可以根据不同条件返回不同的count.Adapter的很多个函数都是这样的风格,你的地盘你做主,达到目的即可,切忌僵化.

  3. getItem(int position),返回对应pos的data的Item,返回值是Object,还是之前说的,没有必要Data的类型是int,你就真返回一个int,完全自己说了算,返回null也可接受(取决与调用者的实现)。

  4. getItemId(int position),返回与此pos对应的Item的row Id(row在这里有点误导,像是DB中的row),这里的rowId基本应该和getItem返回的Item是对应的,当然了,随便你乱来(取决与调用者的实现).

  5. hasStableIds(), Item id与Item之间的对应关系是不是一直保持不变,比较冷门的函数.

  6. getView(int position, View convertView, ViewGroup parent),最热门的函数,Adapter的灵活性主要在这里体现,一般来说是返回与position**相关联的**View,不过这里的相关联也是一个相对的概念,一切取决与你,convertView和parent则是完全取决与AdapterView的具体实现,当然了用不用也完全取决于你。

  7. getViewTypeCount()/getItemViewType(int position)这两个Type相关的函数,注释似乎流露出是为convertView服务的感觉,因为View会有很多种,如果涉及到convertView这种重用机制,那么是需要一个Type来做甄别的,不过个人感觉这个也是全凭调用者怎么去用(当然了,anndroid自己的实现肯定是遵循这个的),一个tip是getViewType返回的是一个int,而这个int的有效范围是0到gitViewTypeCount()-1.

  8. isEmpty()返回的是adapter是否对应的sdata是空的,一般用来决定是否显示empty view. 一般s来说等价于getCount() == 0,但是在有header/footView的case下,显然不对。

  9. interface ListAdapter extends Adapter:为ListView定制化的Adapter,只是多了两个方法:

    • areAllItemsEnabled(),List中的View是不是可以被选以及被点击,这个函数的返回值发生变化时,并不会保证这个改动能够生效.
    • isEnabled(int position),pos位置的View是不是一个seperator(指其不能被选,也不能被点击),如果pos是一个无效位置,抛出异常.
  10. interface SpinnerAdapter extends Adapter:为Spinner定制的Adapter,多了一个方法:

    • getDropDownView(int position, View convertView, ViewGroup parent);, getView的细化版.
  11. abstract class BaseAdaspter implements ListAdapter, SpinnerAdapter: 实现了commmon操作的base 抽象类,可以用于ListView,也可以用于Spinner, 实现的主要方法:

    • DataSetObservable mDataSetObservable, 一个Listener模式的简单封装类. registerDataSetObserver()unregisterDataSetObserver()就是相关的register操作函数.
    • notifyDataSetChanged()/notifyDataSetInvalidated()就是对mDataSetObservable相应方法的简单转发.
    • areAllItemsEnabled()/isEnabled(int position)均返回true.不做花样.
    • getItemViewType(int position)直接返回0, getViewTypeCount(),默认只有一种Type
    • isEmpty(),简单的是getCount() == 0.
    • getDropDownView()直接调了getView().
      BaseAdapter已经可以直接extends来使用了,android源码中很多adpater直接衍生自BaseAdapters.
  12. 经常被使用的派生Adapter类大概有这几种:

    • SimpleAdapter extends BaseAdapter implements Filterable:
    • SimpleCursorAdapter<-ResourceCursorAdapter<-CursorAdapter extends BaseAdapter implements Filterable,
      CursorFilter.CursorFilterClient:
    • ArrayAdapter extends BaseAdapter implements Filterable

你可能感兴趣的:(android)