Android studio PopupWindowにListViewを表示選択する

SwiftのPickerViewに変わるPopupWindowによるリストセレクトを実現しようと考え作成してみました。下記の様なメニューからそれぞれのポップアップリストより選択エントリーするサンプルを参考サイトを元に作ってみました。

![poupwindow000.jpg](https://qiita-image-store.s3.amazonaws.com/0/101462/09c020c7-a84d-08e0-a2d7-2edca7731610.jpeg)
まずはダイアログ風のリスト表示選択例です。
![poupwindow003.jpg](https://qiita-image-store.s3.amazonaws.com/0/101462/69778d65-1ba2-d773-8af4-0cd29595a958.jpeg)
下記の様にPopupWindowにリスト表示し選択エントリーする。
![poupwindow001.jpg](https://qiita-image-store.s3.amazonaws.com/0/101462/b0cb7e84-d927-2f21-59b4-dc85541f3fb3.jpeg)
また下記例では折りたたみ可能なExpandableListViewによりリストの親子表示が可能になります。
![poupwindow002.jpg](https://qiita-image-store.s3.amazonaws.com/0/101462/0fbaff49-5eb5-d8cb-727e-f946e2acc4b2.jpeg)

ソースの例
レイアウト
activity_popup.xml
＜LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:textSize="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ここにポップアップから入力データ"
        android:id="@+id/text1"/>
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ダイアログ表示" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ポップアップリスト表示" />
    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ポップアップExpandableListView" />
</LinearLayout＞
上記レイアウトよりまずダイアログ表示部分
参考サイトhttp://blogs.wankuma.com/bsim/archive/2010/10/28/194314.aspx

 private void showDialog()
    {
        // 親要素
        List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
        // 子要素
        List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();

        // 値を設定
        for (int i = 0; i < 20; i++) {
            // 親要素の値を設定
            Map<String, String> curGroupMap = new HashMap<String, String>();
            curGroupMap.put(NAME, "Group " + i);
            groupData.add(curGroupMap);

            // 子要素の値を設定
            List<Map<String, String>> children = new ArrayList<Map<String, String>>();
            for (int j = 0; j < 15; j++) {
                Map<String, String> curChildMap = new HashMap<String, String>();
                curChildMap.put(NAME, "Child " + j);
                curChildMap.put(IS_EVEN, (j % 2 == 0) ? "This child is even" : "This child is odd");
                children.add(curChildMap);
            }
            childData.add(children);
        }
        final ArrayList<String> rows = new ArrayList<String>();
        rows.add("アドレス帳から選択");
        rows.add("びーしむ\nXXX-XXXX-XXXX");
        rows.add("びーしむ\nXXX@XXX.XXX");
        rows.add("アンドロイドさん\nXXX-XXXX-XXXX");
        rows.add("アドレス帳から選択");
        rows.add("びーしむ\nXXX-XXXX-XXXX");
        rows.add("びーしむ\nXXX@XXX.XXX");
        rows.add("アンドロイドさん\nXXX-XXXX-XXXX");
        rows.add("アドレス帳から選択");
        rows.add("びーしむ\nXXX-XXXX-XXXX");
        rows.add("びーしむ\nXXX@XXX.XXX");
        rows.add("アンドロイドさん\nXXX-XXXX-XXXX");
        rows.add("アドレス帳から選択");
        rows.add("びーしむ\nXXX-XXXX-XXXX");
        rows.add("びーしむ\nXXX@XXX.XXX");
        rows.add("アンドロイドさん\nXXX-XXXX-XXXX");

        //ExpandableListView lv = new ExpandableListView(this);

        final TextView textView = (TextView) findViewById(R.id.text1);



        ListView lv = new ListView(this);
        lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, rows));
        //lv.setScrollingCacheEnabled(false);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            public void onItemClick(AdapterView<?> items, View view, int position, long id) {
                m_Dlg.dismiss();
                textView.setText(rows.get(position).toString());
                //Toast.makeText(PopupActivity.this, rows.get(position).toString(), Toast.LENGTH_LONG).show();

            }
        });

        // ダイアログを表示
        m_Dlg = new AlertDialog.Builder(this)
                .setTitle("宛先を選択")
                .setPositiveButton("Cancel", null)
                .setView(lv)
                .create();

        m_Dlg.show();
    }
PopupWindowを利用し下記レイアウトにてListView表示する例
参考サイトhttp://qiita.com/nein37/items/cc4fe1dc4f9527f8dd59
    private void showpopup(){
        mPopupWindow = new PopupWindow(PopupActivity.this);

        // レイアウト設定
        View popupView = getLayoutInflater().inflate(R.layout.popup_layout, null);

        popupView.findViewById(R.id.close_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mPopupWindow.isShowing()) {
                    mPopupWindow.dismiss();
                }
            }
        });
        mPopupWindow.setContentView(popupView);

        // 背景設定
        mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.popup_background));

        // タップ時に他のViewでキャッチされないための設定
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setFocusable(true);

        //デバイスサイズを取得しpopupwindowサイズ設定する場合
        Display d = getWindowManager().getDefaultDisplay();
        Point p2 = new Point();
        // ②ナビゲーションバーを除く画面サイズを取得
        d.getSize(p2);

        mPopupWindow.setWidth(p2.x-50);
        mPopupWindow.setHeight(p2.y-100);

        // 画面中央に表示
        mPopupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 10);

        final TextView textView = (TextView) findViewById(R.id.text1);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
        // アイテムを追加します
        adapter.add("red");
       adapter.add("green");
       adapter.add("blue");

        ListView listView = (ListView) popupView.findViewById(R.id.listView1);
        // アダプターを設定します
        listView.setAdapter(adapter);
        // リストビューのアイテムがクリックされた時に呼び出されるコールバックリスナーを登録します
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                ListView listView = (ListView) parent;
                // クリックされたアイテムを取得します
                String item = (String) listView.getItemAtPosition(position);
                textView.setText(item.toString());
                //Toast.makeText(PopupActivity.this, item, Toast.LENGTH_LONG).show();
                if (mPopupWindow.isShowing()) {
                    mPopupWindow.dismiss();
                }
            }
        });

    }
さらにPopupWindowに折りたたみListViewを追加する例
 private  void showpopup_expand(){
        Toast.makeText(PopupActivity.this, "mPopupExpandableListView", Toast.LENGTH_LONG).show();


        //json取得
        urlw = "http://www.a-lands.com/bunruijsoncnv.php";
        sendRequest();

        //http://qiita.com/t2low/items/8ac683c7ebf4b6dd1b41
        //上記サイトをカスタマイズ
        mPopupWindow = new PopupWindow(PopupActivity.this);
        // レイアウト設定
        View popupView = getLayoutInflater().inflate(R.layout.custom_listview, null);
        //マージンをViewに充てる
        //popupView.setPadding(50,50,50,50);

        popupView.findViewById(R.id.close_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mPopupWindow.isShowing()) {
                    mPopupWindow.dismiss();
                }
            }
        });
        mPopupWindow.setContentView(popupView);

        // 背景設定
        mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.popup_background));

        // タップ時に他のViewでキャッチされないための設定
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setFocusable(true);

        //http://appdevmem.blogspot.jp/2015/09/get-disp-size.html
        //デバイス ディスプレイサイズを取得しpopupwindowサイズ設定する場合
        Display d = getWindowManager().getDefaultDisplay();
        Point p2 = new Point();
        // ②ナビゲーションバーを除く画面サイズを取得
        d.getSize(p2);
        mPopupWindow.setWidth(p2.x-50);
        mPopupWindow.setHeight(p2.y-500);

        // 画面中央に表示
        mPopupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 10);

        final TextView textView = (TextView) findViewById(R.id.text1);

        //http://dev.classmethod.jp/smartphone/basic-android-component-03-expandablelistview/
        //ExpandableListViewの使いかた
        // 親リスト
        ArrayList<HashMap<String, String>> groupData
                = new ArrayList<HashMap<String,String>>();
        // 子リスト
        ArrayList<ArrayList<HashMap<String, String>>> childData
                = new ArrayList<ArrayList<HashMap<String,String>>>();

        // 親リストに要素を追加
        HashMap<String, String> groupA = new HashMap<String, String>();
        groupA.put("group", "さる");
        HashMap<String, String> groupB = new HashMap<String, String>();
        groupB.put("group", "とり");

        groupData.add(groupA);
        groupData.add(groupB);

        // 子リストに要素を追加(1)
        ArrayList<HashMap<String, String>> childListA = new ArrayList<HashMap<String,String>>();
        HashMap<String, String> childAA = new HashMap<String, String>();
        childAA.put("group", "さる");
        childAA.put("name", "ニホンザル");
        HashMap<String, String> childAB = new HashMap<String, String>();
        childAB.put("group", "さる");
        childAB.put("name", "テナガザル");
        HashMap<String, String> childAC = new HashMap<String, String>();
        childAC.put("group", "さる");
        childAC.put("name", "メガネザル");

        childListA.add(childAA);
        childListA.add(childAB);
        childListA.add(childAC);
        childListA.add(childAA);
        childListA.add(childAB);
        childListA.add(childAC);

        childData.add(childListA);

        // 子リストに要素を追加(2)
        ArrayList<HashMap<String, String>> childListB = new ArrayList<HashMap<String,String>>();
        HashMap<String, String> childBA = new HashMap<String, String>();
        childBA.put("group", "とり");
        childBA.put("name", "ニワトリ");
        HashMap<String, String> childBB = new HashMap<String, String>();
        childBB.put("group", "とり");
        childBB.put("name", "スズメ");

        childListB.add(childBA);
        childListB.add(childBB);

        childData.add(childListB);

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

        //上記サンプルを文字色サイズ設定にカスタマイズ
        SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
                getApplicationContext(),
                groupData,
                android.R.layout.simple_expandable_list_item_1,
                new String[] {"group"},
                new int[] {android.R.id.text1},
                childData,
                android.R.layout.simple_expandable_list_item_2,
                new String[] {"name", "group"},
                new int[] {android.R.id.text1, android.R.id.text2})
        {
            //
            @Override
            public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
                final View itemRenderer = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent);
                final TextView tv1 = (TextView)itemRenderer.findViewById(android.R.id.text1);
                final TextView tv2 = (TextView)itemRenderer.findViewById(android.R.id.text2);
                tv1.setTextColor(0xff000000); // 子リストのタイトルは黒に設定
                tv2.setTextColor(0xff0000ff); // 子リストのサブタイトルは青に設定
                tv1.setTextSize(15);
                tv1.setTextSize(20);
                return itemRenderer;
            }
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
                final View itemRenderer = super.getGroupView(groupPosition, isExpanded, convertView, parent);
                final TextView tv1 = (TextView)itemRenderer.findViewById(android.R.id.text1);
                tv1.setTextColor(0xff0000ff); // 親リストのタイトルは青に設定
                tv1.setTextSize(25);
                return itemRenderer;
            }
        };