RecycleView嵌套EditText,增加删除的时候数据错乱。

在项目中要求使用recycleview嵌套edittext进行输入,点击item中的增加按钮会增加一个item,删除按钮删除当前item,从网上查到一些给edittext设置tag。

RecycleView嵌套EditText,增加删除的时候数据错乱。

下面是我用的方法,我用的adapter:

public class PfUnderlyAddAdapter extends RecyclerView.Adapter<PfUnderlyAddAdapter.MyViewHolder> {
    private List<String> mlist;
    private Context mcontext;
    private List<String> alist = new ArrayList<>();//第一个输入框数据
    private List<String> llist = new ArrayList<>();//第二个输入框数据
    private List<String> clist = new ArrayList<>();//第三个输入框数据
    //点击事件
    public interface OnItemDelClickListener{
        void onItemDelClick(View view, int position);//删除
        void onItemAddClick(View view, int position);//增加
    }
    private OnItemDelClickListener mOnItemDelClickListener;
    public void setOnItemDelClickListener(OnItemDelClickListener mOnItemDelClickListener){
        this.mOnItemDelClickListener = mOnItemDelClickListener;
    }

    public PfUnderlyAddAdapter(List<String> mlist, Context mcontext) {
        this.mlist = mlist;
        this.mcontext = mcontext;
        //初始化数据
        for(int i=0;i<mlist.size();i++){
            alist.add(i,"");
            llist.add(i,"");
            clist.add(i,"");
        }
    }
    //  添加数据
    public void addData(int position,String msg) {
        mlist.add(position, msg);
        alist.add(position,"");
        llist.add(position,"");
        clist.add(position,"");
        //添加动画
        notifyItemInserted(position);
    }
    //  删除数据
    public void removeData(int position) {
        if(position!=0){
            mlist.remove(position);
            alist.remove(position);
            llist.remove(position);
            clist.remove(position);
            //删除动画
            notifyDataSetChanged();
        }else{
            ToastUtil.showShortToast("最少保留一个");
        }
    }
    //获取数据--
    public List<String> getAListData(){
        return alist;
    }
    //获取数据
    public List<String> getLListData(){
        return llist;
    }
    //获取数据
    public List<String> getCListData(){
        return clist;
    }
    @NonNull
    @Override
    public PfUnderlyAddAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.pf_addunderly_item_layout,viewGroup,false);
        return new MyViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull final PfUnderlyAddAdapter.MyViewHolder myViewHolder, int i) {
        //设置删除取消输入框的tag
        //设置第一个输入框=============================分割线============================
        if (myViewHolder.et_address.getTag() instanceof TextWatcher){
            myViewHolder.et_address.removeTextChangedListener ((TextWatcher)myViewHolder.et_address.getTag());
        }
        myViewHolder.et_address.setText(alist.get(i));
        //1.新建一个监听
        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())){
                    alist.add(i,"");
                }else {
                    alist.add(i,s.toString());
                }
            }
        };
        //2.添加一个监听
        myViewHolder.et_address.addTextChangedListener(watcher);
        //3.设置一个Tag
        myViewHolder.et_address.setTag(watcher);

        if (myViewHolder.et_linkman.getTag() instanceof TextWatcher){
            myViewHolder.et_linkman.removeTextChangedListener ((TextWatcher)myViewHolder.et_linkman.getTag());
        }
        myViewHolder.et_linkman.setText(llist.get(i));
        //设置第二个输入框=============================分割线============================
        //1.新建一个监听
        TextWatcher lwatcher = 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())){
                    llist.add(i,"");
                }else {
                    llist.add(i,s.toString());
                }
            }
        };
        //2.添加一个监听
        myViewHolder.et_linkman.addTextChangedListener(lwatcher);
        //3.设置一个Tag
        myViewHolder.et_linkman.setTag(lwatcher);
        if (myViewHolder.et_call.getTag() instanceof TextWatcher){
            myViewHolder.et_call.removeTextChangedListener ((TextWatcher)myViewHolder.et_call.getTag());
        }
        myViewHolder.et_call.setText(clist.get(i));
        //设置第三个输入框=============================分割线============================
        //1.新建一个监听
        TextWatcher cwatcher = 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())){
                    clist.add(i,"");
                }else {
                    clist.add(i,s.toString());
                }
            }
        };
        //2.添加一个监听
        myViewHolder.et_call.addTextChangedListener(cwatcher);

        //3.设置一个Tag
        myViewHolder.et_call.setTag(cwatcher);
        //点击事件
        //判断是否设置了监听器
        if(mOnItemDelClickListener != null){
            //为ItemView设置监听器
            myViewHolder.li_del.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnItemDelClickListener.onItemDelClick(myViewHolder.li_del,myViewHolder.getAdapterPosition());
                }
            });
            myViewHolder.li_add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnItemDelClickListener.onItemAddClick(myViewHolder.li_add,myViewHolder.getAdapterPosition());
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        if(mlist.size()!=0){
            return mlist.size();
        }else{
            return 0;
        }
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }
    class MyViewHolder extends RecyclerView.ViewHolder{
        EditText et_address,et_linkman,et_call;
        LinearLayout li_add,li_del;
        public MyViewHolder(View itemView) {
            super(itemView);
            et_address = itemView.findViewById(R.id.pf_addunderly_ky_item_etaddress);
            et_linkman = itemView.findViewById(R.id.pf_Addunderly_ky_item_etlinkman);
            et_call = itemView.findViewById(R.id.pf_Addunderly_ky_item_etcall);
            li_add = itemView.findViewById(R.id.pf_addunderly_ky_item_tvadd);
            li_del = itemView.findViewById(R.id.pf_addunderly_ky_item_tvdel);
        }
    }
}

亲测解决了自己的问题。如果不行那么您在去找找如果有更好的解决方法,请留言,大家一起学习。