需求是选择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选中了就会获取焦点的实现方法哦!感谢浏览!