RecycleView嵌套EditText,增加删除的时候数据错乱。
在项目中要求使用recycleview嵌套edittext进行输入,点击item中的增加按钮会增加一个item,删除按钮删除当前item,从网上查到一些给edittext设置tag。
下面是我用的方法,我用的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); } } }
亲测解决了自己的问题。如果不行那么您在去找找如果有更好的解决方法,请留言,大家一起学习。