ArrayAdapter:简单、易用,通常用于将数组或List集合的多个值包装成多个列表项
SimpleAdapter:并不简单、功能强大,可用于将List集合的多个对象包装成多个列表项
SimpleCursorAdapter:与SimpleAdapter基本相似,只适用于包装Cursor提供的数据
BaseAdapter:常用于被扩展。
先看一下创建ArrayAdapter对象时必须指定的三个参数
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, list);
参数一:Context:代表访问整个Android应用的接口
参数二:textViewResourceld:一个资源ID,该ID代表一个TextView
参数三:数组或List,负责为多个列表项提供数据
ArrayAdapter很简单,首先创建数组或List即为ListView添加内容,之后创建ArrayAdapter对象,需要指明三个参数,上述已给出具体说明。最后调用ListView的setAdapter()方法即可。
public class MainActivity extends Activity {
ListView view;
ArrayList<String> list = new ArrayList<String>();
ArrayAdapter<String> adapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = (ListView)findViewById(R.id.listView1);
//
for(int i = 0; i < 10; i++) {
list.add(i + "");
}
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, list);
view.setAdapter(adapter);
view.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Toast.makeText(MainActivity.this, arg2 + "", Toast.LENGTH_LONG).show();
}
});
view.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
list.remove(arg2);
adapter.notifyDataSetChanged();
return true;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
xml文件只包含一个ListView组件,这里不再给出。
实例包含为ListView添加列表项,单击显示列表项下标,长摁删除列表项功能。
删除列表项需要调用notifyDataSetChanged(),否则会报错。
SimpleAdapter可以提供更复杂的列表项,包括图片、TextView等。(ArrayAdapter只能是TextView)
SimpleAdapter参数
使用SimpleAdapter最大的难点在于创建SimpleAdapter对象,其需要5个参数。
参数一:同ArrayAdapter参数一相同
参数二:该参数是一个List对象,不同的是,List<>内需要是一个Map对象或继承了Map的集合对象
参数三:该参数指定一个界面布局的ID。(例如要放置复杂组件,则需要一个布局文件指明组件内容)
参数四:该参数应该对应一个String[]数组,该参数提取上述Map对象的key对应的value来生成列表项
参数五:该参数应该是一个int[]的数组,该参数决定填充哪些组件
该xml代码对应参数三
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:paddingLeft="10dp"/>
<TextView
android:id="@+id/desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:paddingLeft="10dp"/>
LinearLayout>
LinearLayout>
后台代码
public class MainActivity extends Activity {
ListView view;
SimpleAdapter adapter;
ArrayList<Map<String, Object>> list;
Map<String, Object> map;
String[] name = {"高祖", "孝帝", "文帝", "景帝", "武帝", "哀帝"};
int draw = R.drawable.han;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = (ListView)findViewById(R.id.listView1);
list = new ArrayList<Map<String, Object>>();
int count = 1;
for(int i = 0; i < name.length; i++, count++) {
map = new HashMap<String, Object>();
map.put("header", draw);
map.put("name", name[i]);
map.put("desc", "汉帝国第" + count + "位皇帝");
list.add(map);
}
adapter = new SimpleAdapter(MainActivity.this,
list, R.layout.simple_adapter, new String[] {"header", "name", "desc"},
new int[] {R.id.header, R.id.name, R.id.desc});
view.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
执行结果
SimpleAdapter复杂的原因在于列表项由TextView变成了容器(容器内可以包含多种组件)。因此可以根据要展现的内容编写后台对应的代码。例如上述实例,需要展现一张图像,两项描述,则后台对应代码需要包括指明图像的id以及两项描述的内容。此外,掌握SimpleAdapter重要的是要理解其对象的每一个参数。