【AndroidのViewを制する】 ListPopupWindowでユーザ操作を受け付ける

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

今回、紹介するListPopupWindowは画面の任意の位置に好きなListViewをポップアップすることができます。
メソッドがたくさんあるため数回に分割して説明します。
今回はListPopupWindowでユーザの操作に関連するメソッドの説明します。

クリック操作を受け付ける

ListPopupWindowでは通常のListViewと同様にユーザのクリック操作を受け付けることができます。

使用メソッド

void setOnItemClickListener(AdapterView.OnItemClickListener clickListener) ListView内のアイテムがクリックされた時のコールバックを設定する。 ListPopupWindow#showより前にコールバックを設定しておかないといけないことに注意してください。
void setSelection(int position) ListView内の指定した位置にあるアイテムを選択状態にする。 この時、setOnItemClickListenerのコールバックメソッドは呼ばれないことに注意してください。
boolean performItemClick(int position) ListView内の指定した位置にあるアイテムをクリックする。
この時、setOnItemClickListenerのコールバックメソッドが呼ばれます。
しかし、チェックリストの場合でもチェックは付かないことに注意してください。
クリック処理が実行されるとtrueを返却し、なんらかの理由(表示されていない等)によりクリック処理が実行されないとfalseを返却する。

トラックパッドやキーボードで選択操作を受け付ける

トラックパッドやキーボードを使用し、リストのアイテムの上をカーソル等で行を選択している状態にすることができます。
この状態の時に行の情報を取得するメソッドが複数定義されています。

使用メソッド

void setOnItemSelectedListener(AdapterView.OnItemSelectedListener selectedListener) ListView内のアイテムがトラックパッドやキーボードで選択された時のコールバックを設定する。
ListPopupWindow#showより前にコールバックを設定しておかないといけないことに注意してください。
long getSelectedItemId() ListView内のアイテムがトラックパッドやキーボードで選択されている行のIDを取得する。
ListPopupWindowが表示されている時だけ使用できます。選択状態の行が無い場合はAdapterView.INVALID_ROW_IDを返却します。
int getSelectedItemPosition() ListView内のアイテムがトラックパッドやキーボードで選択されている行の位置を取得する。
ListPopupWindowが表示されている時だけ使用できます。選択状態の行が無い場合はAdapterView.INVALID_POSITIONを返却します。
Object getSelectedItem() ListView内のアイテムがトラックパッドやキーボードで選択されている行のデータを取得する。
ListPopupWindowが表示されている時だけ使用できます。選択状態の行が無い場合はnullを返却します。
View getSelectedView() ListView内のアイテムがトラックパッドやキーボードで選択されているViewを取得する。
ListPopupWindowが表示されている時だけ使用できます。選択状態の行が無い場合はnullを返却します。
void clearListSelection() ListView内のアイテムがトラックパッドやキーボードで選択されている状態を解除する。

使用サンプル

public class B3Activity extends Activity {
    final String[] strings = new String[] {
            "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout frameLayout = new FrameLayout(this);
        final Button button = new Button(this);
        button.setText("表示");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final ListPopupWindow listPopupWindow = new ListPopupWindow(B3Activity.this);
                listPopupWindow.setAnchorView(button);
                // チェック可能リスト用のレイアウトを持つアダプターを用意します。
                final ListAdapter listAdapter = new ArrayAdapter<>(B3Activity.this, android.R.layout.simple_list_item_checked, strings);

                listPopupWindow.setAdapter(listAdapter);
                // 行がクリックされた時のリスナーを設定します。
                listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        Log.d(TAG, "onItemClick" );
                    }
                });
                // 行が選択状態になった時のリスナーを設定します。
                listPopupWindow.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        Log.d(TAG, "onItemSelected");
                        // 選択された行のIDを返却します。
                        long selectedItemId = listPopupWindow.getSelectedItemId();
                        // 選択された行の位置を返却します。
                        int selectedItemPosition = listPopupWindow.getSelectedItemPosition();
                        // 選択された行のデータを返却します。
                        Object selectedItem = listPopupWindow.getSelectedItem();
                        // 選択された行のViewを返却します。
                        View selectedView = listPopupWindow.getSelectedView();
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {
                        Log.d(TAG, "onNothingSelected");
                    }
                });

                listPopupWindow.show();
                ListView listView = listPopupWindow.getListView();
                // ListViewの選択モードを複数選択に設定します。
                listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
                // 位置が1と2の行を選択済みにします。
                listPopupWindow.setSelection(1);
                listPopupWindow.setSelection(2);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // プログラムからクリック処理を実行します。
                        listPopupWindow.performItemClick(0);
                    }
                });
                return;
            }
        });
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ListPopupWindow.WRAP_CONTENT, ListPopupWindow.WRAP_CONTENT);
        layoutParams.gravity = Gravity.CENTER;
        frameLayout.addView(button , layoutParams);
        setContentView(frameLayout);
    }
}