前回の続き。今回は行を選択して単一のラジオボタンをチェックするサンプルの解説です。

サンプルコード: https://github.com/stack3/AndroidListViewSamples

choice_single_activity.xml

ActivityのレイアウトのListViewは以下のように定義してあります。

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:choiceMode="singleChoice" 
/>

android:choiceMode=”singleChoice”は、単一行のみチェック可能にします。

ChoiceSingleActivity

サンプルのChoiceSingleを選択すると以下の画面が表示されます。

01

クリックした行のラジオボタンがチェックされ、以前の行はチェックが外れます。

02

ChoiceSingleActivity

onCreateで表示項目をListに入れます。

ArrayList items = new ArrayList();
items.add("Item 1");
items.add("Item 2");
items.add("Item 3");

次にListViewにAdapterを設定。ここまではいつもどおりです。

ListView listView = (ListView)findViewById(R.id.listView);
adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_single_choice, items);
listView.setAdapter(adapter);

ArrayAdapterの第2引数に行のレイアウトリソースを渡しています。これはSDKであらかじめ用意されたもので、文字列とラジオボタンを表示します。
表示をカスタマイズしたいときは以下の様なレイアウトを作り、それを指定します。idを@android:id/text1にすると選択用のラジオボタンとして自動的に使われます。

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@android:id/text1"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center_vertical"
  android:checkMark="?android:attr/listChoiceIndicatorSingle"
  android:paddingLeft="8dp"
  android:paddingRight="8dp"
  android:textSize="14sp"
  android:textColor="@color/blue"
/>

最初の行を選択状態にします。

listView.setItemChecked(0, true);

行のクリックイベントを設定。

listView.setOnItemClickListener(listViewOnItemClickListener);
private OnItemClickListener listViewOnItemClickListener = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        ListView listView = (ListView)findViewById(R.id.listView);
        Log.d("", String.format("Checked position:%d", listView.getCheckedItemPosition()));
    }
};

クリックするとログにチェックした行のインデックスを出力します。チェックした行のインデックスはgetCheckedItemPositionで得られます。
ここではonItemClickの引数positionと同じですが。

※ getSelectedItemPositionと混同しがちですが、そちらではありません。このメソッドは一般的なタッチ端末向けのアプリでは使わないと思います。

Infoボタンを押した時は、positionを引数で受け取れないので、getCheckedItemPositionが役に立ちます。

private OnClickListener infoButtonOnClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        ListView listView = (ListView)findViewById(R.id.listView);
        Log.d("", String.format("Checked position:%d", listView.getCheckedItemPosition()));
    }
};

その7へ続く