2012年10月31日水曜日

複数選択可能なリストを作成する

Android3.0では、リストの要素の中から複数の項目を選択することが可能となっています。。
今回は、その方法についてご説明致します。

それでは続きをどうぞ。

複数選択可能なリストの生成

まず、複数の項目にチェックが可能なリストを作成します。こちらは非常に簡単に作成することが可能です。
リストの生成は、基本的に 
リストビューを使ってデータを一覧表示する と同じ方法で行います。
次のソースコードを見てください。

1
2
3
4
5
6
7
8
9
10
11
12
public class MultiSelectActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        ListView listView = (ListView)findViewById(R.id.list);
        listView.setMultiChoiceModeListener(new CallBack());
        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_checked, GENRES));
    }
}

ListActivityであることに注意して下さい。9、10行目の記述にて、各要素のレイアウトをセットしています。
今回は、androidパッケージにデフォルトで含まれているandroid.R.layout.simple_list_item_checkedを仕様しています。ちなみに中身は次のようになっています。

1
2
3
4
5
6
7
8
9
10
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@android:id/text1"
 android:layout_width="match_parent"
 android:layout_height="?android:attr/listPreferredItemHeight"
 android:textAppearance="?android:attr/textAppearanceLarge"
 android:gravity="center_vertical"
 android:checkMark="?android:attr/listChoiceIndicatorMultiple"
 android:paddingLeft="6dip"
 android:paddingRight="6dip"
/>

こちらについては今回詳しくご説明しませんが、チェックボックスを持ったテキストビューのようなイメージです(CheckedTextViewについては、 Spinnerクラスを使ってコンボボックスを表示する でも触れていますので参考にして下さい)。

リストの表示だけなら、上記の記述で問題ありません。

項目が選択されたときのアクションを取得する

次に、各項目が選択された時の動作についてご説明します。動作としては、リストの項目を長押しすることでAction Modeという状態に移行し、Action Modeのときに項目を選択すると、各種アクションが取得できます。Action Modeを解除する場合は、扉図の上部に表示されている緑色の「Done」タブの×ボタンを押下します。

複数選択を可能にし、項目選択時のアクションを取得するには、ListViewのインスタンスに、setChoiceMode()メソッドを用いて、CHOICE_MODE_MULTIPLE_MODAL属性を設定します。

1
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

こちらは、xmlファイルにListViewを定義し、choiceMode属性に"multipleChoiceModal"を設定しても構いません。

さらに、同インスタンスに対して、setMultiChoiceModeLister()メソッドをセットし、MultiChoiceModeListener()のインスタンスを追加します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
listView.setMultiChoiceModeListener(new MultiChoiceModeListener(){
 
@Override
public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) {
// TODO Auto-generated method stub
Log.d("MultiChoiceModeLister", "OnActionItemClicked");
return true;
}
 
@Override
public boolean onCreateActionMode(ActionMode arg0, Menu arg1) {
// TODO Auto-generated method stub
Log.d("MultiChoiceModeLister", "onCreateActionMode");
return true;
}
 
@Override
public void onDestroyActionMode(ActionMode arg0) {
// TODO Auto-generated method stub
Log.d("MultiChoiceModeLister", "onDestroyActionMode");
 
}
 
@Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
// TODO Auto-generated method stub
Log.d("MultiChoiceModeLister", "onPrepareActionMode");
return true;
}
 
@Override
public void onItemCheckedStateChanged(ActionMode arg0, int arg1,
long arg2, boolean arg3) {
// TODO Auto-generated method stub
Log.d("MultiChoiceModeLister", "onItemCheckedStateChanged");
}
});

以上の記述で、ユーザーがリスト項目を長押しした場合にListがActionModeとなり、上記の各種アクションイベントを利用することが可能となります。

最後に、参考までに上記の場合のユーザーの操作とLogの出力順を記載します。
ユーザーのリスト項目長押し→
onCreateActionModeonPrepareActionMode(ここでAction Modeに)→onItemCheckedStateChanged
(Action Mode中、項目をタッチする度に呼ばれる)
ユーザーによるAction Modeの終了時→
onDestroyActionMode

0 件のコメント:

コメントを投稿