2 dotajava dotajava 于 2016.02.17 14:10 提问

android listview和radiobutton 50C

问题是这样的:1 listview 里面有多个item ,其中一个item是已经选中的,现在点击这个选中的radiobutton其他的radiobutton取消选中 ,这个功能已经做好了 了. 如图图片说明,但是点击未选中的radiobutton 想要把默认选中的radiobutton给去掉选中状态,可是没能成功!变成2个radiobutton都选中 图片说明

    @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder item=null;
            if(convertView==null){
                item= new ViewHolder();
                //获得组件,实例化组件
                convertView=layoutInflater.inflate(R.layout.autoset_item, null);
                item.bankNameTxt=((TextView) convertView.findViewById(R.id.cardInfoTxt));
                item.checkAuto=((RadioButton) convertView.findViewById(R.id.checkAuto));
                item.cardIdHide=((TextView) convertView.findViewById(R.id.cardIdTextVIew));
                item.cardIdHide.setVisibility(View.INVISIBLE);




            //可以使用setTag把查找的view缓存起来方便多次重用
            convertView.setTag(item);
        }else{
            item=(ViewHolder)convertView.getTag();
        }

        final  RadioButton radio= (RadioButton) convertView.findViewById(R.id.checkAuto);
        item.checkAuto=radio;

        item.checkAuto.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());
                System.out.println(position + "----------------");

                CardAutoListAdapter.this.notifyDataSetChanged();
            }
        });

            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;

            item.checkAuto.setChecked(res);
//默认选中
            if (data.get(position).get("isAutoPay").equals("0")){
                System.out.println(position);
                item.checkAuto.setChecked(true);
            }
//绑定数据 ,将传入data进行逐个赋值
        item.bankNameTxt.setText(data.get(position).get("bankName") + " **** **** **** " + data.get(position).get("endAcctid") + "");
            item.cardIdHide.setText(data.get(position).get("cardId") + "");

//            else{
//                //if (data.get(position).get("isAutoPay").toString().trim().equals("0")){
//                System.out.println(position);
//                item.checkAuto.setChecked(false);
//                //}
//            }
            return convertView;
    }
    static class ViewHolder {
         TextView bankNameTxt;//银行名称
         TextView cardInfoNo;//银行卡号
         RadioButton checkAuto;//代扣选择
         TextView cardIdHide;//卡号
    }

6个回答

qq_17250009
qq_17250009   2016.02.17 20:23

使用SparseArray保存每个按钮的选中状态,key:position,value:true-false;
给convertView(或者单选按钮)设置点击事件,
每次点击选中相应的radioButton并将含有被点击radioButton的pos对应value置为true。
然后遍历SparseArray,将SparseArray中value等于false的radioButton置为不选中状态。

qq_17250009
qq_17250009 PS:第一次说错一个地方 SparseArray不用保存没选中的状态 只需要保存选中的radioButton就可以了(value置为true) 判断的时候用mSparseArray.contains(key)判断就可以了
接近 2 年之前 回复
qq_17250009
qq_17250009 回复dotajava: 更新listview的时候 SparseArray 中默认选择的也会更新状态,所以不会一直选中。
接近 2 年之前 回复
dotajava
dotajava 回复一口仨馍: 是这样的 但是又会重新更新listview 所以一直会被选中
接近 2 年之前 回复
dotajava
dotajava   2016.02.17 16:01

有没有大神 指导一二

u014614478
u014614478   2016.02.17 17:21

你这个只是针对单个item操作 选中和不选中
需要你写个方法,去除其他item的勾选操作

dongfeng9ge
dongfeng9ge   Ds   Rxr 2016.02.17 18:24

应该用CheckBox,不是RadioButton

Mr_dsw
Mr_dsw   Ds   Rxr 2016.02.17 22:02

这个就是converview复用问题,所以需要一些adapter在内存中进行处理。以前项目开发也遇到过,网上解决方案也挺多,比如:http://blog.csdn.net/fastthinking/article/details/41014411

dotajava
dotajava 回复Mr_dsw: 我这个情况是有个默认选中,然后才是点击单选钮重新通知listview
接近 2 年之前 回复
hwhzyy
hwhzyy   2016.02.19 17:26

1、在主Activity中创建一个static的list存放,是否选中的数据。再创建一个static的更新listview的方法。
2、每次选中item的button时,修改该list的数据(先全为false,再通过gettag方法找到item位置,设置为true)。
3、最后再执行更新listview的方法。
之前我也遇到过,用这个笨方法解决的。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!