问题说明:
在标签文本改变监听中,判断是否所有标签均已经填写完了,当所有标签填写完后,新增一个标签项,结果实体数据错乱,前面填写的标签的值被改变了,具体原因在于在事件监听中,不能直接使用之前创建的实体对象,因为该实体对象是通过传进来的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);