Android之ListView包含RadioButton的單選問題解決辦法

1.最簡潔的解決辦法。

adapter裏保存當前選中的位置變量,getView方法裏,禁用radiobutton的點擊事件,只通過listview的onItemClick事件設置選中位置變量,並且通過notifyDataSetChanged刷新列表。getView方法裏當前項位置爲選中項時設置radiobutton爲選中狀態。否則爲未選中狀態。通過adapter.getSelectedItem方法獲取當前選中項數據。

注意:本來想着讓阻塞radiobutton的獲取焦點、獲取點擊事件,試了各種設置,最後發現rb_status.setClickable(false);禁用radiobutton的點擊事件是有效的。


lv_opt.setAdapter(adapter);
		lv_opt.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				adapter.setSelectedIndex(position);
			}
		});


public class AdapterOptionList extends BaseAdapter<OptionItem> {

	public AdapterOptionList(Context context, List<OptionItem> list) {
		super(context, list);
	}
/**
<span style="white-space:pre">	</span> * 設置選中的項目
<span style="white-space:pre">	</span> * 
<span style="white-space:pre">	</span> * @param position
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>public void setSelectedIndex(int position) {
<span style="white-space:pre">		</span>this.selectedIndex = position;
<span style="white-space:pre">		</span>notifyDataSetChanged();
<span style="white-space:pre">	</span>}
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder viewHolder;
		if (null == convertView) {
			viewHolder = new ViewHolder();
			LayoutInflater inflater = LayoutInflater.from(context);
			convertView = inflater.inflate(R.layout.item_opt,null);
			viewHolder.rb_status = (RadioButton) convertView
					.findViewById(R.id.rb_status);
			viewHolder.tv_title_opt = (TextView) convertView
					.findViewById(R.id.tv_title_opt);
			viewHolder.tv_opt_detail = (TextView) convertView
					.findViewById(R.id.tv_opt_detail);
			convertView.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) convertView.getTag();
		}
		viewHolder.rb_status.setClickable(false);

		OptionItem opt = list.get(position);
		if(selectedIndex == position){
			viewHolder.rb_status.setChecked(true);
			opt.setSeletedStatus(true);
		}else{
			viewHolder.rb_status.setChecked(false);
			opt.setSeletedStatus(false);
		}
		
		viewHolder.tv_title_opt.setText(opt.getName());
		viewHolder.tv_opt_detail.setText(opt.getDiscription());
		return convertView;
	}

	class ViewHolder {
		RadioButton rb_status;
		TextView tv_title_opt;
		TextView tv_opt_detail;
	}
}

2.最簡單粗暴的辦法。

adapter裏設置每一個radiobutton的狀態集合變量,在radiobutton的setOnCheckedChangeListener方法裏設置集合裏的每個radiobutton狀態,然後通過notifyDataSetChanged刷新列表。

比如http://blog.csdn.net/checkin001/article/details/11519131

發佈了83 篇原創文章 · 獲贊 17 · 訪問量 103萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章