解决Android ListView用setOnItemSelectedListener监听item里editText的addTextChangedListener多次调用的bug

需求是选择lv里的子项,并对子项里的editText进行文本监听,并实现某个textview数据的累加

错误代码


            plvOrder.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    
                        
                        EditText petOrderHide = view.findViewById(R.id.pet_order_hide);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            petOrderHide.setShowSoftInputOnFocus(false);//隐藏输入软键盘
                        }
                        if(petOrderHide.isFocusable()){
                            petOrderHide.addTextChangedListener(new TextWatcher() {
                                @Override
                                public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

                                @Override
                                public void onTextChanged(CharSequence s, int start, int before, int count) { }

                                @Override
                                public void afterTextChanged(Editable s) {
                                    //多次选择后输入一次文本,会调用该方法多次
                                    Log.d("TAG", s);
                                }
                            });
                        }
                       
                }
                @Override
                public void onNothingSelected(AdapterView<?> parent) {}
            });

模拟错误,我在item0跟item1之间来回选择,选择item0的次数为2次,选择item1的次数为1,最后在item0里的editText里输入文本,结果是控制台打印两条TAG记录。

跟踪代码分析,原来是我选择了该item多少次,就会打印多少条记录,故调用了多少次addTextChangedListener。

解决办法,让addTextChangedListener只监听一次,使用了setOnItemSelectedListener里的id

最终代码

            List<Long> ids = new ArrayList<>();
            plvOrder.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    if(ids.indexOf(id)==-1){    //控制多次选择出现的bug
                        
                        EditText petOrderHide = view.findViewById(R.id.pet_order_hide);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            petOrderHide.setShowSoftInputOnFocus(false);//隐藏输入软键盘
                        }
                        if(petOrderHide.isFocusable()){
                            petOrderHide.addTextChangedListener(new TextWatcher() {
                                @Override
                                public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

                                @Override
                                public void onTextChanged(CharSequence s, int start, int before, int count) { }

                                @Override
                                public void afterTextChanged(Editable s) {
                                    //对数据进行累加,实现输入一次文本,数据累加一次
                                }
                            });
                        }
                        ids.add(id);
                    }
                }
                @Override
                public void onNothingSelected(AdapterView<?> parent) {}
            });

比较两次代码,你会发现,对原来的文本监听,无论你选择item0多少次,最后只运行一次文本监听代码。

这个bug我分析了很久,网上查找了一大堆资料,都没有setOnItemSelectedListener跟addTextChangedListener的套用。最后自己一步一步跟踪才实现了需求,修改了bug,码字不易,各位看官如对您有帮助,请点波关注了,谢谢。后篇会写关于item里edit选中了就会获取焦点的实现方法哦!感谢浏览!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值