实现如下效果,默认选中并且单选模式:
MainActivity.class:
ListView list_pay; private List<Map<String, Object>> listItems; private String[] textPayName = {"支付方式1", "支付方式2"}; private String[] textOne = {"推荐支付宝用户使用", "推荐微信用户使用"}; private Integer[] imgIDs = {R.mipmap.pay_ali, R.mipmap.pay_weixin};
listItems = new ArrayList<Map<String, Object>>(); for (int i = 0; i < 2; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put("imgIDs", imgIDs[i]); map.put("textPayName", textPayName[i]); map.put("textOne", textOne[i]); listItems.add(map); } pay_type_adapter = new PayTypeAdapter(this, listItems); list_pay.setAdapter(pay_type_adapter); // 根据RadioButton的选择情况 list_pay.setChoiceMode(ListView.CHOICE_MODE_SINGLE);//如果不使用这个设置,选项中的radiobutton无法响应选中事件 list_pay.setOnItemClickListener(this); //自定义回调函数 pay_type_adapter.setOncheckChanged(new PayTypeAdapter.OnMyCheckChangedListener() { @Override public void setSelectID(int selectID) { pay_type_adapter.setSelectID(selectID); //选中位置 payType = selectID; pay_type_adapter.notifyDataSetChanged(); //刷新适配器 } });
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { pay_type_adapter.setSelectID(position); //选中位置 pay_type_adapter.notifyDataSetChanged(); //刷新适配器 }
Adapter:
/** * Created by Administrator on 2016/9/28 0028. */ public class PayTypeAdapter extends BaseAdapter { private Context context; private List<Map<String, Object>> list; private int selectID; private OnMyCheckChangedListener mCheckChange; public PayTypeAdapter(Context context, List<Map<String, Object>> list) { this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } // 自定义的选中方法 public void setSelectID(int position) { selectID = position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.item_pay_type, null); holder = new ViewHolder(); holder.img_pay_icon = (ImageView) convertView.findViewById(R.id.img_pay_icon); holder.text_pay_name = (TextView) convertView.findViewById(R.id.text_pay_name); holder.text_one = (TextView) convertView.findViewById(R.id.text_one); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final RadioButton radio = (RadioButton) convertView.findViewById(R.id.radio_btn); holder.rdBtn = radio; holder.img_pay_icon.setBackgroundResource((Integer) list.get(position).get("imgIDs")); holder.text_pay_name.setText((String) list.get(position).get("textPayName")); holder.text_one.setText((String) list.get(position).get("textOne")); //核心方法,判断单选按钮被按下的位置与之前的位置是否相等,然后做相应的操作。 if (selectID == position) { holder.rdBtn.setChecked(true); } else { holder.rdBtn.setChecked(false); } //当RadioButton被选中时,将其状态记录进States中,并更新其他RadioButton的状态使它们不被选中 // holder.rdBtn.setOnClickListener(new View.OnClickListener() { // // public void onClick(View v) { // // //重置,确保最多只有一项被选中 // for (String key : states.keySet()) { // states.put(key, false); // // } // states.put(String.valueOf(position), radio.isChecked()); // PayTypeAdapter.this.notifyDataSetChanged(); // } // }); // 单选按钮的点击事件监听 holder.rdBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //这一句的意思跟下面的一样,不过这个是itemClick的点击监听,而下面的是RadioButton的点击监听。 selectID = position; /** * 在MyListView中使用mListViewAdapter.setOncheckChanged * 来监听RadioButton的点击事件,(当然,首先要判空) * 当我们按下单选按钮时,我们把按下的item的位置赋值给selectID * ,然后在上面的if语句中判断当前点击的位置与selectID的位置 * 是否相等,如果不相等,那么说明按下了新的位置,那么就把原来位置上的选择取消掉, * 在新的位置让单选按钮显示选中状态就可以了。 */ if (mCheckChange != null) mCheckChange.setSelectID(selectID); } }); // boolean res = false; // if (states.get(String.valueOf(position)) == null || states.get(String.valueOf(position)) == false) { // res = false; // states.put(String.valueOf(position), false); // } else // res = true; // // holder.rdBtn.setChecked(res); return convertView; } // 回调函数,很类似OnClickListener吧,呵呵 public void setOncheckChanged(OnMyCheckChangedListener l) { mCheckChange = l; } // 回調接口 public interface OnMyCheckChangedListener { void setSelectID(int selectID); } static class ViewHolder { ImageView img_pay_icon; TextView text_pay_name; TextView text_one; RadioButton rdBtn; } }简单记录下,最近比较忙,完了有机会再仔细总结。