Single Choice のリスト、左側にチェック(radio)を

android.widget.CheckedTextView を使った
Android 標準の android.R.layout.simple_list_item_single_choice
ArrayAdapter で指定して ListView で表示する方法は、
チェックボックス(or radio)は、右側になってしまう。
とても便利だけど、Web の HTML のように左側にチェックボックスを配置したい
場合、CheckedTextView をそのまま使えない、左側に配置させるような属性もない。

方法は2通り考えられる。
(1) カスタムの CheckedTextView を作成して、左側にチェックボックスを配置するスタイルを書く
(2) RadioButton を左側に配置し、Adpter getView で対処する。

今回は、(2) の方法のサンプル

グローバル変数でリストと選択状態のインデックスを宣言
   List<Integer> list;
   int choiceIndex = -1; // 初期状態は未選択


サンプルなので、対象リストのアイテムは、Integer

ListView は、任意のレイアウトで BaseAdpter 継承で getView メソッドの中で、
上記、choiceIndex をチェックして、RadioButton の setChecked を実行することと、
返却する View と、RadioButton に click Listner をセットする。

final LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final ListView listview = (ListView)findViewById(R.id.listView);
listview.setAdapter(new BaseAdapter(){
   @Override
   public View getView(final int position,View convertView,ViewGroup parent){
      View view = convertView==null ? layoutInflater.inflate(R.layout.radio_list_row,null) : convertView;
      final Integer item = list.get(position);
      RadioButton radio = (RadioButton)view.findViewById(R.id.radioButton);
      String label = "  item - "+item;
      radio.setText(label);
      radio.setChecked(position==choiceIndex);
      radio.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            changeChoice(item,position);  // 下に記述した共通メソッド
         }
      });
      view.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            changeChoice(item,position);  // 下に記述した共通メソッド
         }
      });
      return view;
   }
   @Override
   public long getItemId(int position){
      return position;
   }
   @Override
   public Object getItem(int position){
      return list.get(position);
   }
   @Override
   public int getCount(){
      return list.size();
   }
   // 選択が変更された時
   protected void changeChoice(Object item,int choicePosition){

      choiceIndex = choicePosition;
      
      String msg = item+" position ("+choicePosition+") が選択されました";
      Toast.makeText(RadioLeftListActivity.this,msg,Toast.LENGTH_SHORT).show();
      // 表示更新
      *1.notifyDataSetChanged();

   }
});


*1:BaseAdapter)listview.getAdapter(