2014年1月22日水曜日

ExpandableListViewを使ってみる

今回はExpandableListViewを試したいと思います( ´∀`)bグッ!

殆どListViewと同じですが、違う点としてはアイテムをまとめてグループ化(サブメニュー的な?)が出来る点になります。
クリックするとメニューが開閉される感じですね!(゚д゚)(。_。)(゚д゚)(。_。) ウンウン

■AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.expandablelist1"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.expandablelist1.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
■activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ExpandableListView
        android:id="@+id/exlist"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
■res/values/array.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="group_list_parent">
        <item>parent1</item>
        <item>parent2</item>
    </string-array>
    <string-array name="group_list_child_0">
        <item>parent1_1</item>
        <item>parent1_2</item>
        <item>parent1_3</item>
    </string-array>
    <string-array name="group_list_child_1">
        <item>parent2_1</item>
        <item>parent2_2</item>
    </string-array>
</resources>
■MainActivity.java
package com.example.expandablelist1;

import android.os.Bundle;
import android.app.Activity;

import java.util.ArrayList;
import java.util.HashMap;

import android.widget.ExpandableListView;
import android.widget.SimpleExpandableListAdapter;

public class MainActivity extends Activity {

 private static final String TAG = "MainActivity";

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);
  ExpandableListView view = (ExpandableListView) findViewById(R.id.exlist);

  //
  HashMap info = getResourcesDataExpandableListAdapter("group_list_");

  // groupDataのどのキーデータを利用するか
  String parentName = (String) info.get("parent_name");
  // childDataのどのキーデータを利用するか
  String childName = (String) info.get("child_name");

  // 親一覧用の変数(Adapterで利用するために親だけの一覧用)
  ArrayList<HashMap<String, String>> groupData = (ArrayList<HashMap<String, String>>) info
    .get("parent");

  // 子一覧用の変数(Adapterで利用するために親だけの一覧用)
  ArrayList<ArrayList<HashMap<String, String>>> childData = (ArrayList<ArrayList<HashMap<String, String>>>) info
    .get("child");

  // 親リスト、子リストを含んだAdapterを生成
  SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
    getApplicationContext(), groupData,
    android.R.layout.simple_expandable_list_item_1,
    new String[] { parentName }, new int[] { android.R.id.text1 },
    childData, android.R.layout.simple_expandable_list_item_2,
    new String[] { childName, parentName }, new int[] {
      android.R.id.text1, android.R.id.text2 });

  // ExpandableListViewにAdapterをセット
  view.setAdapter(adapter);
 }

 /*
  *
  */
 private HashMap getResourcesDataExpandableListAdapter(String prefixGroupName) {

  // 親一覧用の変数(Adapterで利用するために親だけの一覧用)
  ArrayList<HashMap<String, String>> groupData = new ArrayList<HashMap<String, String>>();
  String parentName = "parent";

  // 子一覧用の変数
  ArrayList<ArrayList<HashMap<String, String>>> childData = new ArrayList<ArrayList<HashMap<String, String>>>();
  String childName = "child";

  // 親一覧用のstring-arrayのnameにつけた名前のプレフィックス
  // String prefixGroupName = "group_list_";
  String prefixGroupNameChild = prefixGroupName + "";

  // リソースIDを動的に取得する
  int resouresIdParent = getResources().getIdentifier(
    prefixGroupName + "parent", "array", getPackageName());
  // 親一覧を取得する
  // String[] parent = getResources().getStringArray(R.array.parent);
  // 親一覧を取得する
  String[] parent = getResources().getStringArray(resouresIdParent);
  // 親の数を取得する
  int size = parent.length;
  // 親のリストだけループ
  for (int i = 0; i < size; i++) {

   //
   HashMap<String, String> group = new HashMap<String, String>();
   // 親の名前を取得する
   String item = parent[i];
   // parentというキー値に親の名前を設定する
   group.put(parentName, item);
   // Adapterで利用するために親だけの一覧用
   groupData.add(group);

   // リソースIDを生成する
   String childId = prefixGroupNameChild + "child_" + i;
   // リソースIDを動的に取得する
   int arrayId = getResources().getIdentifier(childId, "array",
     getPackageName());
   // 子一覧をxmlから取得する
   String[] child = getResources().getStringArray(arrayId);

   // 子一覧の設定用
   ArrayList<HashMap<String, String>> childList = new ArrayList<HashMap<String, String>>();
   for (String childItem : child) {
    // 子1つの情報用
    HashMap<String, String> childHash = new HashMap<String, String>();
    // 親の名前を設定
    childHash.put(parentName, item);
    // 子の名前を設定
    childHash.put(childName, childItem);
    // 子のリストに追加
    childList.add(childHash);
   }

   //
   childData.add(childList);
  }

  //
  HashMap tmp = new HashMap();
  //
  tmp.put("parent_name", parentName);
  //
  tmp.put("child_name", childName);
  // 親一覧用の変数(Adapterで利用するために親だけの一覧用)
  tmp.put("parent", groupData);
  // 子一覧用の変数(Adapterで利用するために親だけの一覧用)
  tmp.put("child", childData);
  //
  return tmp;

 }

}

デフォルトではリストは折りたたまれています。


メニューをクリックすると開閉されます。

以上です(`・ω・´)ゞビシッ!!

参考URL

0 件のコメント:

コメントを投稿