> 文章列表 > ListView和RadioButton的结合使用

ListView和RadioButton的结合使用

ListView和RadioButton的结合使用

ListView和RadioButton我提供两种思路

1.第一种方法的优点简单好理解,缺点是不能和ListView的item连动起来

2.第二种方法相对来说可能有点麻烦,但好用

第一种方法

public class MyAdapt extends BaseAdapter {public MyAdapt(Activity activity,Context context,String[] str){this.context=context;this.adStr=str;this.activity=activity;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {Help help;if (view==null){help=new Help();view= LayoutInflater.from(context).inflate(R.layout.list_view_layout,null);help.tx=view.findViewById(R.id.te);help.Rb=view.findViewById(R.id.Rd);help.Rb.setChecked(false);view.setTag(help);}else {help=(Help) view.getTag();}help.tx.setText(adStr[i]);//设置idhelp.Rb.setId(i);help.Rb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {if (compoundButton.isChecked()){if (temp!=-1){RadioButton radioButton=activity.findViewById(temp);if (radioButton!=null){//将上次点击的按钮设为falseradioButton.setChecked(false);}}//获取当前按钮的idtemp=compoundButton.getId();}}});if (i==temp){//设为truehelp.Rb.setChecked(true);}else {//设为falsehelp.Rb.setChecked(false);}return view;}class Help{TextView tx;RadioButton Rb;}

上面为主要的代码,第一种方法主要在自定义适配器中进行编码

第二种处理方案

 自定义适配器

    private int selectID;private OnMyCheckChangedListener mCheckChange;@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {Help help;if (view==null){help=new Help();view= LayoutInflater.from(context).inflate(R.layout.list_view_layout,null);help.tx=view.findViewById(R.id.te);help.Rb=view.findViewById(R.id.Rd);help.Rb.setChecked(false);view.setTag(help);}else {help=(Help) view.getTag();}help.tx.setText(adStr[i]);//核心方法,判断单选按钮被按下位置与之前的位置是否相等,然后做相应的操作。if (selectID == i) {help.Rb.setChecked(true);} else {help.Rb.setChecked(false);}// 单选按钮的点击事件监听help.Rb.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {//这一句的意思跟下面的一样,不过这个是itemClick的点击监听,而下面的是RadioButton的点击监听。selectID = i;/*** 在MyListView中使用mListViewAdapter.setOncheckChanged* 来监听RadioButton的点击事件,(当然,首先要判空)* 当我们按下单选按钮时,我们把按下的item的位置赋值给selectID* ,然后在上面的if语句中判断当前点击的位置与selectID的位置* 是否相等,如果不相等,那么说明按下了新的位置,那么就把原来位置上的选择取消掉,* 在新的位置让单选按钮显示选中状态就可以了。*/if (mCheckChange != null)mCheckChange.setSelectID(selectID);}});return view;}// 自定义的选中方法public void setSelectID(int position) {selectID = position;}// 回调函数,很类似OnClickListenerpublic void setOncheckChanged(OnMyCheckChangedListener l) {mCheckChange = l;}// 回調接口public interface OnMyCheckChangedListener {void setSelectID(int selectID);}

在主函数中的定义方案

listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);//如果不使用这个设置,选项中的radiobutton无法响应选中事件listView.setOnItemClickListener(this);adapt.setOncheckChanged(new MyAdapt.OnMyCheckChangedListener() {@Overridepublic void setSelectID(int selectID) {adapt.setSelectID(selectID);adapt.notifyDataSetChanged();}});@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {adapt.setSelectID(i);//选中位置adapt.notifyDataSetChanged();//刷新适配器}

 以上为两种方案,如还有其他方案,后续会进行补充