RecyclerView中嵌套Edittext出现的数据错乱问题解决

RecyclerView 一般用于数据的展示,当我们需要从服务器拿到数据,对数据进行增删改后上传给我们的服务器,如果你的RecyclerView 的Item如下图中包含Edittext时,问题就来了,出现各种Edittext数据错乱问题.


item样式.jpg

下面直接上解决办法:
处理RecyclerView的Adapter,在ViewHolder中绑定Edittext,并在onBindViewHolder()中通过在适当的时机添加或移除Edittext的TextChangedListener来处理数据错乱的问题.这个适当的时机===>选在Edittext获得焦点的时候,添加监听器,失去焦点的时候再移除监听器,可以保证数据的正确性,然后通过在监听器里添加接口回调将数据传递到Activity中,修改Activity中list里的bean,即可达到编辑的目的

public class RvCarScarAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private List<CarScarBean> mList;
private onTextChangeListener mTextListener;
public RvCarScarAdapter(Context context, List<CarScarBean> list) {
    mContext = context;
    mList = list;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.item_car_scar, parent, false);
    return new ItemHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
    final ItemHolder itemHolder = (ItemHolder) holder;
      itemHolder.etContent.setText(mList.get(position).getCarScarRecordContent());
  
    final TextWatcher watcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence sequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence sequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            //通过接口回调将数据传递到Activity中,修改list里的bean
            if (itemHolder.etContent.hasFocus()) {//如果获得焦点再去回调
                mTextListener.onTextChanged(position, itemHolder.etContent.getText().toString());
            }

        }
    };
    //设置EditText的焦点监听器判断焦点变化,当有焦点时addTextChangedListener,失去焦点时removeTextChangedListener
    itemHolder.etContent.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View view, boolean hasFocus) {
            if(hasFocus){
                itemHolder.etContent.addTextChangedListener(watcher);
            }else {
                itemHolder.etContent.removeTextChangedListener(watcher);
            }
        }
    });


}

@Override
public int getItemCount() {
    if(mList!=null &&mList.size()>0){
        return mList.size();
    }
    return 0;
}
public interface onTextChangeListener {
    void onTextChanged(int pos,String str);
}
//设置Edit监听
public void setOnTextChangeListener(onTextChangeListener onTextChangeListener){
    this.mTextListener=onTextChangeListener;
}

public void setData(List<CarScarBean> data) {
    mList = data;
    notifyDataSetChanged();
}


class ItemHolder extends RecyclerView.ViewHolder{
    EditText etContent;
    public ItemHolder(View itemView) {
        super(itemView);
        etContent= itemView.findViewById(R.id.et_content);
    }
}

在Acitvity中设置接口回调

   mScarAdapter.setOnTextChangeListener(new RvCarScarAdapter.onTextChangeListener() {
        @Override
        public void onTextChanged(int pos, String str) {
            mScarBeanList.get(pos).setCarScarRecordContent(str);//修改对应position item编辑的数值
        }
    });
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,497评论 2 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,225评论 25 708
  • 问题1:现在遇到了这么一种情况,我在极光官网发送推送,手机可以收到;但是我使用接口发送推送通知,iOS就收不到了,...
    绪雨成澜阅读 753评论 2 2
  • 我开始害怕了,曾经我觉得死亡真的是一件离我很遥远的事情,可自从那一次,我曾经无数次的想,总会有那么一天,最亲最爱的...
    Ta_nG阅读 321评论 0 1
  • 《问刘十九》 唐·白居易 绿蚁新醅酒,红泥小火炉。 晚来天欲雪,能饮一杯无?
    简达人阅读 135评论 0 0

友情链接更多精彩内容