Android中的Adapter

来源:互联网 发布:罗辑思维 人工智能 编辑:程序博客网 时间:2024/06/10 16:11

Android中的Adapter


Android完全遵循MVC设计模式,其Activity是Controller,Layout是View,Style、String等是Model。 而Layout形式太多,数据无法直接绑定到上面,因此Android就引用了Adapter这个机制作为复杂数据的展示转换载体,所以各种Adapter只不过是转换方式和能里不一眼而已。

Android中Adapter类图:

Adapter接口及实现类的类图

其中常用的实现类主要是:

1. BaseAdapter:通常用于被扩展。扩展BaseAdapter可以各列表项进行最大限制的定制。
2. ArrayAdapter:简单易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项。
3. SimpleAdapter:并不简单、功能强大的Adapter,可用于将List集合的多个对象包装成多个列表项。
4. SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据。

Adapter是将数据绑定到UI界面上的桥接类。 Adapter负责创建显示每个项目的子View和提供对下层数据的访问。在多数情况下,你不需要创建自己的Adapter。Android提供了一系列Adapter来将数据绑定到UI Widget上。
 

Adapter中的体系结构:

在Android开发中列表的使用是十分常见的。Google对列表的封装使列表既有显示传统文本列表的能力,也有加入了诸如选择项、复选项等处理事件的能力。

在Android的API中,List和Adapter都被放在了android.widget包内。包内的具体结构我这里先不展示了,主要侧重List和Adapter。Adapter的作用就是将要在列表内显示的数据和列表本身结合起来。列表本身只完成显示的作用,其实他就是继承自ViewGroup类,但是他又有一个独特的函数就是setAdapter()就是完成了View和Adapter的结合。Adapter如同其本身含义,其实就是一个适配器,他可以对要显示的数据进行统一的封装,主要是将数据变成View并提供给List。

从上面的类图大致可以知道: 顶层Adapter接口是其他Adapter的基类,在Adapter接口中主要有一下一些方法:

abstract int getCount();abstract Object getItem(int position);abstract long getItemId(int position);abstract int getItemViewType(int position);abstract View getView(int position,View convertVeiw,ViewGroup parent);

以上是比较重要的方法,ArrayAdapter他们也是重新实现以上方法的。在实际的开发过程中,往往我们要自己做属于自己的Adapter,以上方法都是需要重新实现的。

Adapter的使用:

不论是那种适配器模式,也不管是Listview也好还是gridview也好,对他们填充数据,都是分三步走。

如:ListView listView=(ListView) findViewById(R.id.listview_simple);  

2、创建一个数据填充器,可以是BaseAdapter、SimpleAdapter,也可以是与数据库相关联的CursorAdapter。

直接使用系统封装的SimpleAdapter:

SimpleAdapter simpleAdapter = new SimpleAdapter(this, data, R.layout.simple_item,         new String[] { "name", "info" }, new int[] { R.id.simple_name, R.id.simple_info});   

重写系统的simpleadpter:

public class ListSimpleAdpter extends SimpleAdapter {    private List<? extends Map<String, ?>> data = new ArrayList<>(); //要使用到的数据源    private int resource;  //填充数据的资源文件,主要是布局文件即R.layout.xxx    private String[] from;    private Context context;    public ListSimpleAdpter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {        super(context, data, resource, from, to);        this.context = context;        this.data = data;        this.resource = resource;        this.from = from;    }    @Override    public int getCount() {  //item的总行数        return data == null ? 0 : data.size();    }    @Override    public Object getItem(int position) { //item对象        return data.get(position); //这里返回的是一个Map或其子类的对象。具体对象还得用Map取    }    @Override    public long getItemId(int position) {  //item的id        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) { //绘制每一个item        Holder holder = null;        if (convertView == null) { //这里对于Adapter的优化,用的很古老的ViewHolder、ViewCache办法:            convertView= LayoutInflater.from(context).inflate(resource, null);            holder = new Holder();            holder.imageView=(ImageView) convertView.findViewById(R.id.listitem_pic);            holder.title=(TextView) convertView.findViewById(R.id.listitem_title);            holder.content=(TextView) convertView.findViewById(R.id.listitem_content);            convertView.setTag(holder);        } else  {            holder=(Holder) convertView.getTag();        }        //向Item项中设置数据          /**         * 按照执行逻辑,这里的这段代码会执行多次, 本来每个Item上的的数据只需要写到ListView的Item上一次         * 但这里,当position重新定位到原来已经写好数据的Item上时,又会重新执行下面这段代码,即重新向已经         * 写好数据的的Item上写数据。故在这里应该要做一些处理           */          holder.imageView.setImageResource(Integer.parseInt(data.get(position).get(from[0]).toString()));        holder.title.setText(data.get(position).get(from[1]).toString());        holder.content.setText(data.get(position).get(from[2]).toString());         return convertView;    }    class Holder{ //假设每个Item项上都有一个ImageView、两个TextView。        ImageView imageView;        TextView title;        TextView content;    }}

3、将数据填充到对象中去

listView.setAdapter(simpleAdapter);  

其他的Adapter与这个Adapter的使用都差不多,就在描述了…..

原创粉丝点击