android.widget.Adapter
一、定义:
一个适配器对象被当作一个视图的 适配视图与基础数据之间的桥粱。适配器提供了获取数据的途径,也同样负责为数据集中的每一项数据创建视图。
我们都知道:视图(View)用来显示数据(Data),但怎么来显示,是需要控制(Control)的。
在这里,我并不是要引入MVC来大谈特谈(实际上,我并不对其有很深入的理解),而只是用它来理清本节内容,以陈述网络上已经存在的不少的误解(当然,一开始,对事物的理解并不都是非常正确的)。
你完全可以跳过下面这段话:
---------------------------------------------------
A。什么是MVC设计模式?
1、模型(Model)
业务逻辑层。用于封装业务逻辑和数据模型。
2、视图(View)
表示层。就是与用户实现交互的界面,通常实现数据的输入和输出功能。
3、控制器(controller)
控制层。起到控制整个业务流程的作用,实现View层跟Model层的协同工作。
B。MVC的组件类型及功能
------------------------------------------------------------
那我们在使用时,为什么只需要准备一个Adapter(ArrayAdapter, SimpleAdapter),一个视图(如ListView, GridView)、一个活动(Activity)就可以了啊?
实际上,当我们使用ListView, GridView时,它们已默默为我们准备好了一切:
注意上面最重要的一句:
↳ android.widget.AdapterView<T extends android.widget.Adapter>
查看AdapterView的源代码中类的声明:
这段定义中,说明了如下内容:
A。AdapterView将与Adapter关联(Adapter是用来适配数据(Data Source)的,在具体的Adapter内部实现数据与具体控件的绑定(对应),
然后再一个setAdapter( XXXAdapter )就搞定);
B。AdapterView也将是一个视图(View);
C。那控制部分呢?则主要集中在我们的Activity中(如菜单点击、列表项点击、长按等),即Controller。
所以当我们使用GridView, ListView时,我们就已经拥有了视图(VIEW)部分;
再setAdapter(adapter),就关联了数据(DATA)部分;
再在一个Activity中去使用以上二者,也即控制它们,就关联了控制(CONTROLLER)部分。
三、在开发中,我们参照的最多的就是Google Doc了,但其中关于Adapter的实现类的大多数例子仅实现了下述四个接口(实际上通常也仅需如此):
public int getCount();//在绘制视图时,会对其进行调用。
public Object getItem(int position);//可能在事件处理时,会调用。
public long getItemId(int position);//可能在事件处理时,会调用。
public View getView(int position, View convertView, ViewGroup parent);//在绘制视图时,会对其进行调用。
对于第二个、第三个方法,最常见的做法就是直接 return position;实际上,虽然通常情况下,你这样可以平安无事,但是一旦做与事件处理相关的内容时,便可能会为你带来意想不到的错误。举例如下:
这是源码:AdapterView.java中,处理选中项的逻辑代码。若我们按上述方式,直接返回位置信息,那么当我们需要对选中项进行处理时,这里就会让你的应用崩溃掉。
再看一看方法原型:public Object getItem(int position);没错,就是这个Object,让我们按上述方法进行,虽然多数时间OK了,但心底就是惴惴不安。
那么该怎么实现它呢?再查源码:ArrayAdapter.java
注:此成员变量的定义如下,
那关于public long getItemId(int position)呢?是否可以按上上述直接return position;呢?答案是按情况而论:
如在ArrayAdapte中就是如此,因为数组是线性的啊,它的下标就是它的数据项的ID;
再来参考一个例子:(getItem() 与 getItemId() 在 CursorAdapter中的实现方式 )
至此,我想应该是对如何使用Adapter有较好的理解了吧?!!
四、常见Adapter列表
Known Indirect Subclasses
ArrayAdapter<T>, BaseAdapter, CursorAdapter,
HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter,
SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter