AlertDialogのリスト項目選択でダイアログを閉じないようにする|Android開発

      2018/05/23

AlertDialogでリストを表示した際、リストの項目選択でダイアログが閉じるケースがあります。
本記事は項目選択ではダイアログを閉じず、且つ項目の更新を行う方法になります。

項目選択でダイアログが閉じるコード

下記の様にsetItems(mViewItems, mItemSelectedListener)だと項目選択でダイアログが閉じてしまいます。

private String[] mViewItems;
private final DialogInterface.OnClickListener mItemSelectedListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (mViewItems.length <= which) {
            Logger.e("bab index");
            return;
        }
        mViewItems = new String[] { "123", "456", "789" };
    }
};

public void showDialog() {
    mViewItems = new String[] { "ABC", "DEF", "GHI" };
    AlertDialog.Builder builder = new AlertDialog.Builder(this)
            .setItems(mViewItems, mItemSelectedListener) // これだとアイテム選択で閉じる
            .setTitle("TITLE")
            .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            })
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
    builder.show();
}

項目選択で閉じるダイアログ

項目選択でダイアログを閉じないようにする

下記では、項目選択ではダイアログを閉じないようにして項目を入れ替えています。
但し、入れ替え後のリスト表示が入れ替え前のスタイルと若干変わってしまいます。

public void showDialog() {
    String[] items = new String[] { "ABC", "DEF", "GHI" };
    AlertDialog.Builder builder = new AlertDialog.Builder(this)
            .setItems(items, null)
            .setTitle("TITLE")
            .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            })
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
    // アイテム選択で閉じないための対応 & リスト更新.
    final AlertDialog dlg = builder.create();
    ListView listView = dlg.getListView();
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ListView listView = (ListView) parent;
            String[] items = new String[] { "123", "456", "789" };
            ArrayAdapter<String> adapter = new ArrayAdapter<>(MyActivity.this, android.R.layout.simple_list_item_1, items);
            listView.setAdapter(adapter);
        }
    });
    dlg.show();
}

選択前

選択前

選択後

選択後

選択後の文字開始座標が異なっています。また文字色も異なっています。文字色は端末によって変わらない場合もありました。

リスト更新でスタイルが変わらないようにする

ListViewsetViewしてやることでスタイルが統一されます。
setDividerHeight(0)をコールしない場合は項目間にボーダーが表示されます。※本記事のサンプル画像ではボーダーがありましたが、ボーダーが無い端末もあったため、ボーダー無しで設定しています。

public void requestView(ReadPictures pictures) {
    String[] items = new String[] { "ABC", "DEF", "GHI" };
    ListView listView = new ListView(this);
    listView.setDividerHeight(0);
    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items);
    listView.setAdapter(adapter);

    AlertDialog.Builder builder = new AlertDialog.Builder(this)
            .setView(listView)
            .setTitle("TITLE")
            .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            })
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
    // アイテム選択で閉じないための対応 & リスト更新.
    final AlertDialog dlg = builder.create();
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ListView listView = (ListView) parent;
            String[] items = new String[] { "123", "456", "789" };
            ArrayAdapter<String> adapter = new ArrayAdapter<>(MyActivity.this, android.R.layout.simple_list_item_1, items);
            listView.setAdapter(adapter);
        }
    });
    dlg.show();
}

選択前

選択前

選択後

選択後

文字色が薄くなっていますが、端末によっては濃く表示されていました。

 - Android