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; } }