Android之深入理解Adapter的四个接口

来源:互联网 发布:上海书友会 知乎 编辑:程序博客网 时间:2024/05/01 22:09

android.widget.Adapter


一、定义:

一个适配器对象被当作一个视图的 适配视图与基础数据之间的桥粱。适配器提供了获取数据的途径,也同样负责为数据集中的每一项数据创建视图。


二、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



原创粉丝点击