Android Adapter 详解

学习Android 也有一段时间,不得不说我做的很失败,甚至是连菜鸟都算不上,只研究表面不研究深层次的东西,论坛不逛,博客不写。今天不知受了什么刺激或者是脑袋哪根弦搭错了,决定好好学习下,顺便把自己的过程记录下来。如果有写的不好的地方,不全面的地方,请多多体谅,欢迎指正,交流,请教。

好了,废话不多说了,开始我的第一篇博客之旅....

从公司的最近项目开始吧,项目是能做出来,可是并不是全都了解原理,那就一点点开始吧。首先登录用的是AutoCompleteAdater,继承关系为AutoCompleteAdater---SimpleCursorAdapter---ResourceCursorAdapter--CursorAdapter--BaseAdapter--- 实现了ListAdapter, SpinnerAdapter----最后到Adapter.放一个网上都存在的图吧。


   由图可以看到在Android中与Adapter有关的所有接口、类的完整层级图。我也是一点点的研究,就从最基本的adapter开始吧。

先来一张图吧


这个许多地方也都存在,但是我觉得还是放上比较好。用有道翻译出来的源码解释是(英语水平不太好)一个适配器充当桥梁在adapterview视图和基础数据之间,适配器还负责做数据集合中的每一项的视图(Android view)。通俗来说就是数据和界面的纽带。

Adapter中的方法

先说比较常用的方法吧:


      //适配器中所表示的数据的项数

int getCount();  

     //得到指定位置的数据

Object getItem(int position);

//得到相关行id列表中指定的位置,返回项的指定位置

 long getItemId(int position);

 //得到一个视图显示数据集的数据在指定位置,你可以创建一个视图或者导入一个xml布局文件,当导入的时候,父视图(gridview,listview..)将默认布局参数,除非你使用 android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)指定根视图。


  //三个参数 position我们想要的数据集内位置的视图

convertView老视图的重用,如果可能,你应该在使用前检查非空和适当的类型这一项,如果这个视图不可能显示正确的数据,这种方法可以创建一个新的视图。

异构列表可以显示他们正确的视图类型,所以这个视图总是正确的类型,见getViewTypeCount(),getItemViewType(int)

parent 父视图

返回 视图 对应的数据在指定的位置。

View getView(int position, View convertView, ViewGroup parent);


这是最常用的几个方法,自定义的类的话通常要实现这几个方法。

下面是几个不常用的属性和方法:

1、 static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;

//某项视图类型导致忽略此项目视图 例如客户不希望特定视图的转换,此视图不会被重用。

  2、 static final int NO_SELECTION = Integer.MIN_VALUE;

    // 没有介绍(猜测:没有选择的项时,赋予整数最小值,有待确定,知道的同学可以告诉下)

     3、 void registerDataSetObserver(DataSetObserver observer);

     // 注册一个Observer,当Adapter所表示的数据改变时会通知它,DataSetObserver是一个抽象类,定义了两个方法:onChanged与onInvalidated 

     4、  void unregisterDataSetObserver(DataSetObserver observer);

// 取消注册一个Observer (观察者)

  5、 boolean hasStableIds();

 // 在基础数据中显示条目id是否是稳定的,如果相同的id总是指同一个对象,则返回true

  6、 int getItemViewType(int position);

 // 得到指定项的视图类型。整数代表视图的类型,

如果一个可以转化成其他的,两个视图可以共享相同的数据类型。注意:整数范围0到-1将被归还

  7、 int getViewTypeCount();

 // 返回在getView()中将被创建的视图类型的数量,每种类型代表一种视图,可以转换,

如果在所有项目类型的视图中总是返回相同的,那么这个方法返回1,

  8、 boolean isEmpty();

 // 如果这个适配器不包含任何数据,返回true,这个用来确定是否返回空视图。

典型的实现是getCount()==0,但是getCount()包含页眉和页脚,专业的适配器可能想要一个不同的行为。


第一次写博客,写这么点东西花了将近两个小时敲打,主要是字体的颜色啊,图片什么的不太会,在想是不是都现在项目里写的,在复制到这里面,不过第一次吗,慢慢就好了,对吧,嘻嘻。里面可能有什么不好的地方或者不对的地方,请多多指教,我会耐心的更改的。

让我们一起进步,一起成长。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章