Android ArrayAdapter に ラジオボタンを置く

arrayadapter_with_radio

Android だと、リストビューから一件選択するのに、ラジオボタンが表示されることがよくある。

確かに、上記のようなダイアログを作ってて、対象が1件だけだと、ぱっと見メッセージと区別がつかないのでどうしていいか分からないが、ラジオボタンがあると「選択してね」感がかもしだされる。

ラジオボタンを使ってみる

で、ラジオボタンを配置しようと、単純にラジオボタンを含むレイアウト(R.id.rdo_select_item)を作成して動かしてみると・・・

ArrayAdapter<String> adapter 
    = new ArrayAdapter(context,
                               R.layout.row_items, 
                               R.id.rdo_select_item, 
                               items);

きちんと画面には表示されるが、リストビューの setOnItemClickListener に 登録したリスナーでリストの選択がどうもハンドリング出来ない。

android.R.layout.simple_spinner_dropdown_item を使ってみる

と、まぁ表示はされるのだが、文字色が黒だったり、どうもしっくりこない。

あと、選択したらきちんと動くのだが、ラジオボタンはフェイクのようで、選択状態の見た目にはならない。

ArrayAdapter adapter 
    = new ArrayAdapter(context,
                               android.R.layout.simple_spinner_dropdown_item, 
                               items);

TextView の代わりに CheckTextView を使いつつ、listChoiceIndicatorSingle を指定してみる

ArrayAdapter の使い方は、通常のTextView を単純に使用するのと同じにしておいて、

ArrayAdapter adapter 
    = new ArrayAdapter(context,
                               R.layout.row_items, 
                               R.id.txt_select_item, 
                               items);

レイアウトの方で、TextView の代わりに、CheckedTextView を使う。

そして、checkMark 属性に、android.R.attr.listChoiceIndicatorSingle を指定する。

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
          android:id="@+id/txt_select_item" 
          android:layout_width="fill_parent" 
          android:layout_height="fill_parent" 
          android:textSize="20sp" 
          android:checkMark="?android:attr/listChoiceIndicatorSingle">
</CheckedTextView>

これで、見た目的には、希望通りになった。

ただ、android.R.layout.simple_spinner_dropdown_item 同様、ラジオボタンはフェイクだけど・・・ まぁいいや。

これに限らず、android.R には、こねたがいっぱいつまってそうなので、いずれ詳しくみてみたい。

また一歩野望に近づいた。