由图可以看到在Android中与Adapter有关的所有接口、类的完整层级图。在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 BaseAdapter,SimpleAdapter,ArrayAdapter,SimpleCursorAdapter等。
BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
SimpleAdapter有最好的扩充性,可以自定义出各种效果。
SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
SimpleAdapter:
ArrayAdapter比较简单,这里就不说了,简单说一下SimpleAdapter,SimpleAdapter可以直接使用,下面介绍一下 SimpleAdapter中参数的含义
new SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) context :这个表示上下文
data :填充的数据,一个Map集合中的数据代表在一个条目的数据,每一个条目的数据都以键值对的方式存入到 Map集合中,然后再放到List集合中,
resource:条目的布局文件
from:这个字符串数组里面存放的是 map集合中的键 ,用于在Adapter中取出数据用的
to :这个int数组 存放的是条目布局中个个组件的id ,但顺序要与from中的 键相对于,即这个组件的数据在 Map中的键要与这个组件的 id 对应。方便在Adaper中为其添加数据
BaseAdapter:
一般自定义适配器都用BaseAdapter,首先继承这个抽象类,然后实现其方法
如图,这是一个自定义的Adapter,他的功能和SimpleAdapter类似。这里需要写一个构造函数和覆盖父类的方法。构造方法中的参数和SimpleAdapter的一样,下面介绍一下覆盖的方法的含义
getCount(): 返回data的大小,即条目的总数
getItem():返回当前条目的数据,这里返回的Map集合,也可返回具体数据
getItemId():返回当前位置的 条目Id 这里直接返回位置即可,因为位置也是唯一的
getView():这个方法是用对条目来填充数据,然后将填充好的数据返回
在getView中可以为组件设置单击事件,这样就可以响应组件的点击事件。但要注意的是,需要将组件设置为不可获取焦点,但可点击,这个可以直接在xml文件clickable="boolean",focusable=“boolean”。因为如果获取焦点的话会夺去ListView获取GridView 的焦点,然后条目不可点击了。值得注意的是TextView默认情况下clickable,focusable都为false,Button都为true。
HandleView是用来优化的,避免findViewById()这条语句的重复执行,原理就是将获取的组件放入HandleView中,然后再将HandleView放入convertView的Tag中,用的时候在取出
ListView 和 GridView 的 setOnItemClickListener 方法设置的是条目监听,只能监听条目,不能监听条目中的组件,所以要自定义适配器,在getView中添加条目中组件的监听事件,而SimpleAdapter却不能,这就是自定义Adapter的优点