Android Adapter 源码笔记(1)

134 篇文章 0 订阅
12 篇文章 0 订阅
  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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值