ExpandListViewで階層表示
ExpandListViewに階層データを保持するAdapterを設定することで
画面に階層表示のリスト表示を作ることができる
モバイルのWikipediaとか
スマホ向けのクックパッドで
押すとリストがでるようなかんじ
大きな見出しと、詳細記事などを作るときに使える
ExpandListViewは
折りたたみ可能なListView
親リストへはカテゴリー
子リストにはデータを配置して
カテゴリーだけ表示するために
データを折りたたんで表示するときに使う
ExpandListViewを使うには
まずレイアウトファイルでExpandListViewを設定
1 2 3 4 5 | < ExpandListView android:id = "@+id/expandlist" android:layout_width = "match_parent" android:layout_height = "match_parent" /> |
次に、JavaでAdapterの設定をする
ExpandListViewのインスタンスを取得し
データを設定したAdapterをセットする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | //親リスト作成 ArrayList<HashMap<String,String>> groupData = new ArrayList<HashMap<String,String>>(); //子リスト作成 ArrayList<HashMap<String,String>> childData = new ArrayList<ArrayList<HashMap<String,String>>>(); //親リストを要素追加 HashMap<String,String> groupA = new HashMap<String,String>(); groupA.put( "group" , "Linux" ); HashMap<String,String> groupB = new HashMap<String,String>(); groupB.put( "group" , "Android" ); groupData.add(groupA); groupData.add(groupB); //Linuxの子リストへ要素追加 ArrayList<HashMap<String,String>> childListA = new ArrayList<HashMap<String,String>>(); HashMap<String,String> childA = new HashMap<String,String>(); childA.put( "group" , "Linux" ); childA.put( "name" , "Ubuntu" ); HashMap<String,String> childB = new HashMap<String,String>(); childB.put( "group" , "Linux" ); childB.put( "name" , "CentOS" ); HashMap<String,String> childC = new HashMap<String,String>(); childC.put( "group" , "Linux" ); childC.put( "name" , "Fedora" ); childListA.add(childA); childListA.add(childB); childListA.add(childC); //Androidの子リストへ要素追加 ArrayList<HashMap<String,String>> childListB = new ArrayList<HashMap<String,String>>(); HashMap<String,String> childBA = new HashMap<String,String>(); childBA.put( "group" , "Android" ); childBA.put( "name" , "Nexus7" ); HashMap<String,String> childBB = new HashMap<String,String>(); childBB.put( "group" , "Android" ); childBB.put( "name" , "Nexus5" ); childListB.add(childBA); childListB.add(childBB); childData.add(childListB); //親リスト、子リストを含んだAdapterを作成 SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter( getApplicationContext(), groupData(), android.R.layout.simple_expandable_list_item_2, new String[]{ "name" , "group" }, new int []{android.R.id.text1,android.R.id.text2} ); //ExpandableListViewにAdapterをセット ExpandableListView exList = (ExpandableListView)findViewById(R.id.expandlist); exList.setAdapter(adapter); |
ExpandableListViewのデータ構造は
階層構造になるため
ListView
GridViewのような単一データ構造ではない
なので、Adapterとしては
ExpandableListAdapterクラスを継承したAdapterである必要がある
ExpandableListAdapterクラスは内部で
親データの取得用メソッドと
子データの取得用メソッドがあるので
これをOverrideすることで
複雑な階層構造のデータ形式を扱えるようになる