Android——Adapter

Adapter——本身只是一个接口。Adapter是将数据绑定到UI界面上的桥接类。Adapter负责创建显示每个项目的子View和提供对下层数据的访问。

数据适配器作用:把复杂的数据(数组、链表、数据库、集合等)填充在指定视图界面上。

数据适配器是连接数据源和视图界面的桥梁 

介绍一下最常用的三个实现类:

1、ArrayAdapter:简单易用,通常用于将数组或List集合的多个值包装成多个列表项。每个列表项只能是TextView。

实现过程:新建适配器——添加数据源到适配器——视图加载适配器

//定义一个数组
    String[] arr1 = {"aa","bb","cc"};
        //将数组包装为ArrayAdapter
        ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,R.layout.array_item,arr1);
        //为ListView设置Adapter
        list.setAdapter(adapter1);//list为ListView组件

创建ArrayAdapter时必须指定如下三个参数:

Context:代表了访问整个Android应用的接口

textViewResourceId:一个资源ID,该资源ID代表了一个TextView,该TextView组件将作为ArrayAdapter的列表项组件。(控制每个列表项组件)

数组或List:该数组或List将负责为多少列表项提供数据。(为列表项提供数据)

2、SimpleAdapter:功能强大,可用于将List集合的多个对象包装成多个列表项

实现过程:新建适配器——添加数据源到适配器——视图加载适配器

举个小例子:一个列表项包含:最左边为图标,接着同一行上边是标题,下面是一些说明文字。

先定义了三个数组,分别存储上述三类。

    //创建一个List集合,List集合的元素是Map

    List<Map<String,Object>> listItems = new ArrayList<Map<String, Object>>();
    for(int i =0;i<names.length;i++){
        Map<String,Object> listItem = new HashMap<String,Object>();
        listItem.put("header",imageIds[i]);
        listItem.put("name",names[i]);
        listItem.put("desc",descs[i]);
        listItems.add(listItem);
    }
    //创建一个SimpleAdapter
    SimpleAdapter simpleAdapter = new SimpleAdapter(this,listItems,R.layout.simple_item,
            new String[]{"name","header","desc"},new int[]{R.id.name,R.id.header,R.id.desc});
    ListView list = (ListView) findViewById(R.id.mylist);
    list.setAdapter(simpleAdapter);

五大参数解释:

Context:上下文

data:数据源。是一个List<? extends Map<String,?>>类型的集合对象,该集合中每个Map<String,?>对象生成一个列表项

Resource:列表项的布局文件ID

from:Map中的键名

to:绑定数据视图中的ID,与from成对应关系

3、BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。

BaseAdapter基本结构

1)public int getCount():适配器中数据集中数据的个数

2)public Object getItem(int position): 获取数据集中与指定索引对应的数据项

3)public long getItemId(int position): 获取指定行对应的ID

4)public View getView(int position, View convertView, ViewGroup parent): 获取每一个Item的显示内容。

ViewHolder优化BaseAdapter思路:

1)创建Bean对象,用于封装数据

2)在构造方法中初始化用于映射的数据List

3)创建ViewHolder类,创建布局映射关系

4)判断convertView,为空则创建,并设置tag,否则通过tag来取出ViewHoldr。

5)给ViewHolder中的控件设置数据

详细代码(布局文件未给出):

public class ItemBean {

    public int itemImageResid;
    public String itemTitle;
    public String itemContent;

    public ItemBean(int itemImageResid, String itemTitle, String itemContent) {
        this.itemImageResid = itemImageResid;
        this.itemTitle = itemTitle;
        this.itemContent = itemContent;
    }
}
public class MyAdapter extends BaseAdapter {
     private LayoutInflater mLayoutInflater;
    // 映射数据
    private List<ItemBean> mDataList;
    private long mSumTime;
    public MyAdapter(Context context, List<ItemBean> list) {
        mLayoutInflater = LayoutInflater.from(context);
        mDataList = list;
    }
   // 获取数据量
    @Override
    public int getCount() {
        return mDataList.size();
    }
    // 获取对应ID项对应的Item
    @Override
    public Object getItem(int position) {
        return mDataList.get(position);
    }
    // 获取对应项ID
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 逗比式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        // 获取纳秒时间 更加精确
        long start = System.nanoTime();
        // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
        View view = mLayoutInflater.inflate(R.layout.item, null);
        // 实例化控件
        ImageView itemImage = (ImageView) view.findViewById(R.id.iv_image);
        TextView itemTitle = (TextView) view.findViewById(R.id.tv_title);
        TextView itemContent = (TextView) view.findViewById(R.id.tv_content);
        // 取出bean对象
        ItemBean bean = mDataList.get(position);
        // 设置控件的数据
        itemImage.setImageResource(bean.itemImageResid);
        itemTitle.setText(bean.itemTitle);
        itemContent.setText(bean.itemContent);
        long end = System.nanoTime();
        long dValue = end - start;
        mSumTime += dValue;
        // 输出每次getView消耗的时间和
        Log.d("xys", String.valueOf(mSumTime));
        return view;
        // 逗比式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>24409529
        // 普通式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        // 获取纳秒时间 更加精确
//        long start = System.nanoTime();
//        if (convertView == null) {
        // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
//            convertView = mLayoutInflater.inflate(R.layout.item, null);
//        }
//        ImageView itemImage = (ImageView) convertView.findViewById(R.id.iv_image);
//        TextView itemTitle = (TextView) convertView.findViewById(R.id.tv_title);
//        TextView itemContent = (TextView) convertView.findViewById(R.id.tv_content);
//        // 取出bean对象
//        ItemBean bean = mDataList.get(position);
        // 设置控件的数据
//        itemImage.setImageResource(bean.itemImageResid);
//        itemTitle.setText(bean.itemTitle);
//        itemContent.setText(bean.itemContent);
//        long end = System.nanoTime();
//        long dValue = end - start;
        // 输出每次getView消耗的时间和
//        Log.d("xys", String.valueOf(mSumTime));
//        return convertView;
        // 普通式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>19271161
        // 文艺式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        // 获取纳秒时间 更加精确
//        long start = System.nanoTime();
//        ViewHolder holder = null;
//        if (convertView == null) {
//            holder = new ViewHolder();
        // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
//            convertView = mLayoutInflater.inflate(R.layout.item, null);
//            holder.img = (ImageView) convertView.findViewById(R.id.iv_image);
//            holder.title = (TextView) convertView.findViewById(R.id.tv_title);
//            holder.content = (TextView) convertView.findViewById(R.id.tv_content);
//            convertView.setTag(holder);
//        } else {
//            holder = (ViewHolder) convertView.getTag();
//        }
        // 取出bean对象
//        ItemBean bean = mDataList.get(position);
        // 设置控件的数据
//        holder.img.setImageResource(bean.itemImageResid);
//        holder.title.setText(bean.itemTitle);
//        holder.content.setText(bean.itemContent);
//        long end = System.nanoTime();
//        long dValue = end - start;
//        mSumTime += dValue;
        // 输出每次getView消耗的时间和
//        Log.d("xys", String.valueOf(mSumTime));
//        return convertView;
        // 文艺式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>16325820
    }



    // ViewHolder用于缓存控件
    class ViewHolder{
        public ImageView img;
        public TextView title;
        public TextView content;
    }
}
原文地址:https://www.cnblogs.com/jingmengxintang/p/5756971.html