RecyclerView中嵌套Edittext,添加监听的问题
如图,需要在滚动列表中输入框加入监听事件
addTextChangedListener()
adapter中,因为recyclerview的复用特性,容易造成滑动时候数据混乱。
adapter中之前代码如下。
@Override public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) { holder.tvSn.setText(data.get(position).getName() + "(" + data.get(position).getCodeX() + ")"); // 通过tag判断当前editText是否已经设置监听,有监听的话,移除监听再给editText赋值 if (holder.etNum.getTag() instanceof TextWatcher) { holder.etNum.removeTextChangedListener((TextWatcher) holder.etNum.getTag()); } // 必须在判断tag后给editText赋值,否则会数据错乱 if (data.get(position).scanNum == 0) { holder.etNum.setText(data.get(position).getNum() + ""); } else { holder.etNum.setText(data.get(position).scanNum + ""); } data.get(position).scanNum = Integer.parseInt(holder.etNum.getText().toString()); holder.etNum.setSelection(holder.etNum.getText().toString().length()); final TextWatcher watcher = 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) { if (TextUtils.isEmpty(s.toString())) { holder.etNum.setHint("1"); data.get(position).scanNum = 0; } else { if (Integer.parseInt(holder.etNum.getText().toString()) > data.get(position).getNum()) { ToastUtils.showToast("不能超过出库单中的数量"); holder.etNum.setText(data.get(position).getNum() + ""); } holder.etNum.setSelection(holder.etNum.getText().toString().length()); data.get(position).scanNum = Integer.parseInt(holder.etNum.getText().toString()); } } }; holder.etNum.addTextChangedListener(watcher); holder.etNum.setTag(watcher); }
结果还是滑动出错,需要给输入框添加 获取焦点事件。
holder.etNum.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
//只有获取到焦点时才添加监听器
if (hasFocus){
holder.etNum.addTextChangedListener(watcher);
holder.etNum.setTag(watcher);
}
}
});
解决问题!