ExpandListViewで階層表示

ExpandListViewで階層表示

ExpandListViewに階層データを保持するAdapterを設定することで
画面に階層表示のリスト表示を作ることができる

モバイルのWikipediaとか
スマホ向けのクックパッドで
押すとリストがでるようなかんじ

大きな見出しと、詳細記事などを作るときに使える

ExpandListViewは
折りたたみ可能なListView

親リストへはカテゴリー

子リストにはデータを配置して
カテゴリーだけ表示するために
データを折りたたんで表示するときに使う

ExpandListViewを使うには
まずレイアウトファイルでExpandListViewを設定

<ExpandListView
android:id="@+id/expandlist"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

次に、JavaでAdapterの設定をする
ExpandListViewのインスタンスを取得し
データを設定したAdapterをセットする

//親リスト作成
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することで
複雑な階層構造のデータ形式を扱えるようになる

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です