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(