适配器对象作为一个AdapterView和底层数据的视图之间的桥梁。该适配器提供访问的数据项。该适配器还负责使数据集的查看每个项目。
他的子类有:
ArrayAdapter<T>:数组适配器
BaseAdapter:基本适配器
CursorAdapter:光标适配器
HeaderViewAdapter:顶部视图适配器
ListAdapter:列表适配器
ResourceCursorAdapter:资源光标适配器
SimpleAdapter:简单适配器
SimpleCursorAdapter:简单光标适配器
SpinnerAdapter:微调适配器
WrapperListAdapter:包装列表适配器
dapter在Android中占据一个重要的角色,它是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如图1直观的表达了Data、Adapter、View三者的关系。
图1 Adapter、数据、UI三者关系(PS:此图来自Google I/O)
图2:Android中Adapter类型层级图
Adapter本身只是一个接口,它派生了ListAdapter和SpinnerAdapter两个子接口,其中
ListAdapter为AbsListView提供列表项,而SpinnerAdapter为AbsSpinner提供列表项。
Adapter接口及其实现类的继承关系类图如图。
在继承关系图可以看出,几乎所有Adapter都继承了BaseAdapter,而BaseAdapter同时实现了ListAdapter、SpinnerAdapter两个接口,
因此BaseAdapter及其子类可以同时为AbsListView、AbsSpinner提供列表项。
ArrayAdapter:简单、易用的Adapter,通常用于将数据或List集合的多个值包装成多个列表项。
SimpleAdapter:并不简单、功能强大的Adapter,可用于将List集合的多个对象包装成多个列表项。
SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数量数据。
BaseApadter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。
实例:使用ArrayAdapter创建ListView
//调用列表控件
ListView list = (ListView) findViewById(R.id.list);
//定义一个数组
String[] arr = {"天安门","长城","天坛"};
//将数组包装为ArrayAdapter
ArrayAdapter<Stering> adapter = new ArrayAdapter(this,R.layout.checked_item,arr);
//为ListView设置Adapter
list.setAdapter(adapter);
上面的程序中两行粗体字代码创建两个ArrayAdapter,创建ArrayAdapter时必须指定如下三个参数。
1,Context:这个参数无须多说,它代表了访问整个Android应用的接口。几乎创建所有组件都需要传
Context对象。
2,textViewResourceld:一个资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter
的列表项组件。
3,数据或List:该数组或List将负责为多个列表项提供数据。
实例:使用SimpleAdapter创建ListView
//创建一个List集合,List集合的元素的Map
List<Map<String,Object>> listItems = new ArrayList<Map<String,Object>>();
//创建一个SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this,listItem,R.layout.simple_item,
new String[] {"personName","header","desc"},
new int[] {R.id.name,R.id.header,R.id.desc});
1,第2个参数:该参数应该是一个List<? extends Map<String,?>?>类型的集合对象,
该集合中每个Map<String,?>对象生成一个列表项。
2,第3个参数:该参数指定一个界面布局的ID。例如此处指定了R.layout.simple_item,
这意味着使用/res/layout/simple_item.xml文件作为列表项组件。
3,第4个参数:该参数应该是一个String[]类型的参数,该参数决定提取Map<String,?>
对象中哪些些key对应的value来生成列表项。
4,第5个参数:该参数应该是一个int[]类型的参数,该参数决定填充哪些组件。
实例:扩展BaseAdapter实现不存储列表项的ListView
ListView myView = (ListView) findViewById(R.id.myList);
BaseAdapter adapter = new BaeAdapter(){
public int getCount(){
` //指定一共包含40个选项
return 40;
}
public Object getItem(int position){
return null;
}
//重写该方法,该项方法的返回值将作为列表项的ID
public long getItemId(int position){
return position;
}
//重写该方法,该方法的返回的View将作为列表框
public View getView(int position,View convertView,ViewGroup parent){
//创建一个LinearLayout,并向其中添加两个组件
LinearLayout line = new LinearLayout(BaseAdapterTest.this);
line.setOrientation(0);
ImageView image = new ImageView(BaseAdapterTest.this);
image.setImageResource(R.drawable.ic_launcher);
TestView text = new TestView(BaseAdapterTest.this);
text.setTextSize(20);
line.addView(image);
line.addView(text);
return line;
}
}
myList.setAdapter(adapter);
getCount():该方法的返回值控制该Adapter将会包含多少个列表项。
getItem(int position):该方法的返回值决定第position处的列表项的内容。
getItemId(int position):该方法的返回值决定第position处的列表项的ID。
getView(int position,View convertView,ViewGroup parent):该方法的返回值决定第position处的列表项组件。