ListView与RadioButton的结合单选

实现如下效果,默认选中并且单选模式:



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;
    }
}
简单记录下,最近比较忙,完了有机会再仔细总结。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值