记录一个适配器关于position导致的数据错乱问题

问题说明:

在标签文本改变监听中,判断是否所有标签均已经填写完了,当所有标签填写完后,新增一个标签项,结果实体数据错乱,前面填写的标签的值被改变了,具体原因在于在事件监听中,不能直接使用之前创建的实体对象,因为该实体对象是通过传进来的position获取的,在各种监听事件中需要使用holder.getLayoutPosition();这样才能获取真正的当前的位置。

 @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        //是否开启复用
        //holder.setIsRecyclable(false);
        DispensingRegisterDialogEntity dispensingRegisterDialogEntity = dispensingRegisterDialogEntityList.get(position);

holder.tagValueEt.addTextChangedListener(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 paramAnonymousEditable) {
                try
                {
                    //正确方式
                    DispensingRegisterDialogEntity dispensingRegisterDialogEntity = dispensingRegisterDialogEntityList.get(holder.getLayoutPosition());
                   dispensingRegisterDialogEntity.setLabel(paramAnonymousEditable.toString());
//错误方式,不能直接使用上面创建的实体,因为位置不正确
                    //dispensingRegisterDialogEntity.setLabel(paramAnonymousEditable.toString());
                    if(TextUtils.isEmpty(paramAnonymousEditable.toString())) {
                        if(!TextUtils.isEmpty(dispensingRegisterDialogEntity.getPatientName())) {
                            dispensingRegisterDialogEntity.setPatientName("");
                            notifyItemChanged(holder.getLayoutPosition());
                        }else{
                            dispensingRegisterDialogEntity.setFlag("2");
                            setImageBackground(holder.imageIv, dispensingRegisterDialogEntity);
                        }
                    }
                    if (isNeedAddItem(dispensingRegisterDialogEntityList)) {
                        sizeAdd(holder);
                    }
                } catch (Exception localException)
                {
                    localException.printStackTrace();
                }
            }
        });

此外新增数据的时候这个位置需要注意下

dispensingRegisterDialogEntityList.add(dispensingRegisterDialogEntity);
notifyItemInserted(dispensingRegisterDialogEntityList.size() - 1);
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值