ListViewの選択モードを切り替える


ListViewでは、フラグの指定によって、簡単に選択モードを切り替えることが可能です。
選択モードの切り替えには以下の3パターンがあります。
※API LEVEL 11 にてさらにもう一つのモードが追加されましたが、それについては「複数選択可能なリストを作成する」を参照して下さい。

  • 選択しない(通常のListView)
  • 一項目のみ選択可能
  • 複数項目選択可能

今回はこれらのモードの切り替え方法と、複数選択モードの場合に選択されているデータを取得する例を一緒に解説していきたいと思います。

それでは続きをどうぞ

ListViewの選択モードを設定する
ListViewの選択モードを切り替えるには、ListView#setChoiceMode()メソッドにフラグを指定します。以下のサンプルコードを見て下さい

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final ListView listView = getListView();
        listView.setItemsCanFocus(false);
        //選択モードを指定する
        listView.setChoiceMode(ListView.CHOICE_MODE_NONE);

        setListAdapter(new ArrayAdapter(this,
                android.R.layout.simple_list_item_checked, GENRES));
    }

ListView#setChoiceMode()メソッドの引数に ListView.CHOICE_MODE_NONE をセットしています。 ListView.CHOICE_MODE_NONEをセットすると、ListViewは選択モードでなくなります。つまり、通常のListViewというわけです。

次に、 ListView#setChoiceMode()メソッドにListView.CHOICE_MODE_SINGLEをセットします。すると、ListViewは一つの項目のみ選択可能なリストとなります。例えば下図だと、まず左図のように「rongon_xp」を選択後、「kobashinG」を選択すると、右図のように「rongon_xp」のチェックが外れ、「kobashinG」のみ選択された状態になります。

 listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

最後に、 ListView#setChoiceMode()メソッドにListView.CHOICE_MODE_MULTIPLEをセットします。すると、ListViewは下図のように、複数の項目を選択可能なリストとなります。

 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

選択されている項目数と項目を取得する
ここでは、選択終了ボタンを押下することで、複数項目選択時に、選択されている項目名を取得し、次の画面にてそれらを表示します。

ListView#getCheckedItemPositions()メソッドでマップ情報を取得できます。マップでは、選択されている項目がInt型のKeyとBoolean型の値の組み合わせでマッピングされています。このマップ情報を利用して、Int型のKeyで指定した項目が選択されていた場合は文字列に連結していきます。

        button.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				String selectItem = "";

				//マップの情報を取得する
				SparseBooleanArray checked = listView.getCheckedItemPositions();

				for(int i=0; i<=GENRES.length;i++){
					if(checked.get(i) == true){
					        //マッピングされている(選択されている)項目だった場合は文字列に連結する
						selectItem = selectItem + GENRES[i] + "¥n";
					}
				}

				Intent intent = new Intent(getApplicationContext(), SelectList.class);
				intent.putExtra("select_item", selectItem);
				startActivity(intent);
			}
        });
(...省略...)
    private static final String[] GENRES = new String[] {
        "mhidaka", "kacchi0516", "rongon_xp", "kobashinG", "seit", "kei_i_t", "furusin_oriver"
    };

SparseBooleanArray.get(int key)メソッドは、keyに割り振られた項目が選択状態だった場合(マッピングされていた場合)、trueを返します。trueだった場合にはそのKeyに該当する項目を配列から取り出して文字列に連結しています。  最後に文字列をIntentに付加してSelectItemsList画面に遷移し、受け取った文字列をTextViewに表示させます。

public class SelectItemsList extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.checked_item);

	    String items = null;

	    items = getIntent().getExtras().getString("select_item");

	    TextView textView = (TextView)findViewById(R.id.textView1);
	    textView.setText(items);

    }
}
One Comment