当ListView的item中包含EditText控件时,对EditText进行监听输入内容变化时,因为ListView的缓存机制,会导致EditText的addTextChangedListener监听事件会被多次重复调用。
解决方案一
不适用ListView的缓存机制
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View viewLine;
TextView tv;
LinearLayout ll;
TextView tvChoose;
EditText et;
convertView = View.inflate(ctx, R.layout.item_child_msg, null);
viewLine = convertView.findViewById(R.id.view);
tv = (TextView) convertView.findViewById(R.id.tv_label);
tvChoose = (TextView) convertView.findViewById(R.id.tv_choose);
ll = (LinearLayout) convertView.findViewById(R.id.ll);
et = (EditText) convertView.findViewById(R.id.et_value);
return convertView;
}
不建议这样使用
解决方案二
在EditText的OnFocusChangeListener监听事件中,通过焦点判断,在处于获取焦点再对EditText的addTextChangedListener监听事件进行操作
holder.et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
finalHolder.et.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) {
}
});
}
}
});