当我们想用合适的方式显示并操作一些数据(如数组,链表,数据库等)的时候,就需要用到适配器视图(AdapterView)。适配器视图是一组可以通过特定的适配器将适配器视图的子视图与特定数据绑定起来的控件。即其子视图由绑定某类型数据的适配器Adapter决定,AdapterView用于当你需要在布局中显示存储数据时(不是字符串或可绘制资源)。
AdapterView是ViewGroup的子类,画廊Gallery,列表视图ListView,微调控件Spinner和GridView等就是适配器视图AdapterView子类的例子,用来绑定到特定类型的数据并以一定的方式显示。
AdapterView对象有两个主要责任:
·用数据填充布局
·处理用户的选择
常见的适配器有SimpleAdapter,SimpleCursorAdapter,ArrayAdapter。
以ListView为例子
如果要用ListActivity(也可以不继承ListActivity),则 Activity的Layout文件中必须包括一个(只能一个)ListView,且ListView的id= "@id/android:list"。即活动继承ListActivity,android就会在布局文件中查找下面两个特殊id,没有继承就可以随便定义id,没有继承的实例:http://justsee.iteye.com/blog/932591。
如下代码,一个标准的ListActivity Layout文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="8dp"
android:paddingRight="8dp">
<ListView android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#00FF00"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
<TextView id="@id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FF0000"
android:text="No data"/>
</LinearLayout>
请注意 ListView与TextView的id。前面说了,ListView的Id为固定不变的,为”@id/android:list”,ListActivity会根据id自动查找ListView引用;但如果当ListView中没有值而又想提示一句话时,那么用于指定显示提示信息的TextView的id 必须为”"@id/android:empty",提示的信息可以通过android:text进行指定。
OK,关于如何布局说完了,那么如何给List绑定值,并进行操作呢?
首先我们需要确实的是,ListView的布局也完成了,并通过调用setContentView(…)进行了绑定,但直到现在我们还没有确定ListView中的第一行显示的格式是什么,是直接显示文字还是要“图文并茂”的显示。
Android系统为我们提供了多种模板进行选择(android.R.layout),如
android.R.layout.simple_list_item_1 每项有一个TextView
android.R.layout.simple_list_item_2 每项有两个TextView
android.R.layout.simple_list_item_checked 带CheckView的项
android.R.layout.simple_list_item_multiple_choise 每项有一个TextView并可以多选
android.R.layout.simple_list_item_single_choice 每项有一个TextView,但只能进行单选。
但然,如果以上项模板还无法满足你的要求,那只能自定义模板了(相当简单,就是定义一个layout布局)。
自定义模板可以根据自己的需要定义成任意的格式,包括图片、方案及其他可显示的View,不用多说,自己定义就好了,关键是如果使用并进行模板的绑定。
如何要对ListView进行数据绑定,必须使用到一个接口:Adapter。
其中最经常与ListView进行配合使用的有ArrayAdapter、 SimpleCursorAdapter及SimpleAdapter等。
从名称可以看出ArrayAdapter使用的是一个ArrayAdapter做为数据源,SimpleCursorAdapter使用的是一个Cursor使用数据源,都比较容易理解,那么如何使用SimpleAdapter作为数据的适配器呢?呵呵继续学习~~~~
ArrayAdapter:
String[] data = { "Item1", "Item2","Item3", "Item4", "Item5" };
/*构造适配器*/
listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_single_choice, data));//用的是自定义模版
/*设置适配器*/
this.setListAdapter(adapter);
/*设置选择事件事件监听*/
this.getListView().setOnItemSelectedListener(
new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
类名.this.setTitle(((TextView)arg1).getText());
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
类名.this.setTitle("NothingSelected");
}
});
SimpleCursorAdapter:
//从数据库中查询Cursor
cursor = adapter.getAllNotes();
startManagingCursor(cursor);
//设置要显示的数据源中的列名(需要包含在cursor中)
String[] from = new String[] { DiaryDbAdapter.KEY_COLUMN_TITLE,DiaryDbAdapter.KEY_COLUMN_CREATEED };
//显示的View(自定义模板中的View)
int[] to = new int[] { R.id.txtRowTitle, R.id.txtRowCreateed };
//绑定
SimpleCursorAdapter notes = new SimpleCursorAdapter(this,R.layout.diaryrow, cursor, from, to);
setListAdapter(notes);
具体实例可以参考:http://justsee.iteye.com/blog/932591
SimpleAdapter:
SimpleAdapter将一个List做为数据源,可以让ListView进行更加个性化的显示。而List中的第一项是个Map<String,?>(用到泛型),其中Map中的每项将与ListView中的每项进行一一对应绑定。Ok,看一下构造:
SimpleAdapter(Context context,List<? Extends Map<String,?>> data,int resource,String [] form, int [] to);
Context:当前上下文,一般把Activity.this传递进行。
Data: 数据源。
Resource: 自定义的layout模板资源,可以用 R.layout.xxx获取引用。
Form: 定义ListView中的每一项数据索引,索引来自于Map<String,?>,即指定要显示的内容。
To:View数组,在ListView模板中的定义View,与Form中需要一一对应。
事例代码:
List<Hashtable<String, Object>> listContent= new ArrayList<Hashtable<String, Object>>();
for (int i = 0; i < deviceList.size(); i++) {
Hashtable<String, Object> table= new Hashtable<String, Object>();
table.put("name", deviceList.get(i).Name);
table.put("address", deviceList.get(i).Address);
table.put("type", deviceList.get(i).Type + "");
listContent.add(table);
}
adapter = new SimpleAdapter(HeartActivity.this,
listContent,
R.layout.child, //自定义的layout
new String[] { "name", "address" },
new int[] {R.id.txtDeviceName, R.id.txtDeviceAddress }
);
setListAdapter(adapter);
以上代码使用了Hashtable做为一个Map,并添加到一个List<Hashtable<String, Object>>当中。之后new一个SimpleAdapter,注意SimpleAdapter是如何生成的。
具体实例可以参考:http://justsee.iteye.com/blog/932591