RecyclerView中嵌套Edittext,添加监听的问题

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);
        }
    }
});

 

解决问题!