2012年3月11日 星期日

Android ExpandableListActivity and SimpleCursorTreeAdapter

在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);

沒有留言: