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;
}
@Override
public 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]);
//设置id
help.Rb.setId(i);
help.Rb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (compoundButton.isChecked()){
if (temp!=-1){
RadioButton radioButton=activity.findViewById(temp);
if (radioButton!=null){
//将上次点击的按钮设为false
radioButton.setChecked(false);
}
}
//获取当前按钮的id
temp=compoundButton.getId();
}
}
});
if (i==temp){
//设为true
help.Rb.setChecked(true);
}else {
//设为false
help.Rb.setChecked(false);
}
return view;
}
class Help{
TextView tx;
RadioButton Rb;
}
上面为主要的代码,第一种方法主要在自定义适配器中进行编码
第二种处理方案
自定义适配器
private int selectID;
private OnMyCheckChangedListener mCheckChange;
@Override
public 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;
}
// 回调函数,很类似OnClickListener
public 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() {
@Override
public void setSelectID(int selectID) {
adapt.setSelectID(selectID);
adapt.notifyDataSetChanged();
}
});
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
adapt.setSelectID(i);//选中位置
adapt.notifyDataSetChanged();//刷新适配器
}
以上为两种方案,如还有其他方案,后续会进行补充