一、前言:
今天发现一个怪问题,在Edittext中编辑文本的时候logcat一直刷屏,打印相同的日志,导致页面卡顿,在afterTextChanged方法中做调用次数统计,确实可以触发多次。
- addTextChangedListener多次重复执行的问题?
- RecyclerView列表中的EditText 复用问题?
效果图如下:

二、addTextChangedListener多次重复执行的问题?:
private TextWatcher mTextWatcher;
//1、移除原来的文字改变监听,避免列表刷新或者view复用所造成TextWatcher被多次调用
if (mTextWatcher !=null){
mEt.removeTextChangedListener(mTextWatcher);
}
//2 创建TextWatcher
mTextWatcher = 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) {
//todo
}
};
//3 先移除,后添加
mEt.addTextChangedListener(mTextWatcher);
//4 设置值
mEt.setText(value);
三、RecyclerView列表中的EditText 复用问题?(包含解决1的问题)
public class InStorageAdapter extends BaseQuickAdapter<InStorageBean, BaseViewHolder> {
private TextWatcher mTextWatcher;
public InStorageAdapter(int layoutResId, @Nullable List<InStorageBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(@NonNull BaseViewHolder helper, InStorageBean item) {
//1、布局位置
int layoutPosition = helper.getLayoutPosition();
EditText et_number = helper.getView(R.id.et_number);
if (mTextWatcher != null) {
et_number.removeTextChangedListener(mTextWatcher);
}
mTextWatcher = 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 editable) {
//2、EditText监听的位置
int position = helper.getLayoutPosition();
//3、 输入框可见,并且布局位置和监听位置一致
if (et_number.hasFocus() && position == layoutPosition) {
String str = editable.toString().trim();
if (!TextUtils.isEmpty(str)) {
int value = Integer.parseInt(str);
if (value > 0) {
//4、设置值
item.setInStorage(value);
} else {
item.setInStorage(0);
}
}
}
}
};
et_number.addTextChangedListener(mTextWatcher);
//4 展示数据
if (item.getInStorage() == 0) {
et_number.setText("");
} else {
et_number.setText(String.valueOf(item.getInStorage()));
}
}
}
网友评论