在Android app的開發中,若想實現點擊listview中的某個item則展開下面的子list,可利用ExpandableListActivity來達到此目的,官方的範例如下:
http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html
而此list activity對應到的adapter可使用SimpleExpandableListAdapter或者extends BaseExpandableListAdapter作彈性的使用,說明如下:
// 使用SimpleExpandableListAdapter顯示ExpandableListView
SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
this,//指定Context
groups,//第一層集合
R.layout.groups,//第一層所使用的layout
new String[] { "group" },//fromto,就是map中的key,指定要顯示的對象
new int[] { R.id.group }, //顯示在groups中的id
childs,//第二層集合
R.layout.child,//第一層所使用的layout
new String[] { "child" },//fromto,就是map中的key,指定要顯示的對象
new int[] { R.id.child });
setListAdapter(adapter);
而若第一二層都想使用cursor為基礎之資料的話,則可extends SimpleCursorTreeAdapter來實現這個功能,底下附上最近部分片段
private class MyExpandableListAdapter extends SimpleCursorTreeAdapter {
public MyExpandableListAdapter(Cursor cursor, Context context,
int groupLayout, int childLayout, String[] groupFrom,
int[] groupTo, String[] childrenFrom, int[] childrenTo) {
super(context, cursor, groupLayout, groupFrom, groupTo,
childLayout, childrenFrom, childrenTo);
}
/*
*取得第一層之cursor後,return該cursor對應之下一層資料的資料查詢結果
*/
@Override
protected Cursor getChildrenCursor(Cursor arg0) {
String[] queryArgs = new String[1];
queryArgs[0] = arg0.getString(arg0.getColumnIndex("_id"));
return getOrderByTicket("order_id=?", queryArgs);
}
}
實作完自訂的adapter後,則可於使用setListAdapter設定該adapter
//取得第一層之cursor
parentCursor=db.getAll();
//宣告使用的adapter
MyExpandableListAdapter adapter =
new MyExpandableListAdapter(
parentCursor,//第一層使用之cursor
this,//context
R.layout.parentLayout,// parent layout
R.layout.childLyout,// child layout
new String[] { "table_num","customer_count", "price" },//parent cusror column
new int[] {R.id.textView1, R.id.textView2, R.id.textView3 },//parent layout mapping id
new String[] { "name", "count" },//child cursor column
new int[] {R.id.textView1, R.id.textView2 });//child layout mapping id
ExpandableListView expListView = getExpandableListView();
//如果不想顯示indicator可將groupindicator設成null
expListView.setGroupIndicator(null);
//指定adapter
setListAdapter(adapter);