Android RecyclerView添加非空校验后仍插入空自定义行问题
问题产生原因
当前的输入校验逻辑存在流程漏洞:
- 姓名、号码的空判断是两个独立的if-else分支,仅在输入为空时弹出Toast提示,没有中断后续代码执行
- 无论输入是否合法,
list.add()插入数据、notifyItemInserted()刷新列表、关闭弹窗的逻辑都会无条件执行,初始值为空字符串的name和number会被直接存入列表,最终生成空行 - 原有判断没有处理首尾空格的场景,用户输入全空格时也会被判定为有效内容
- 额外注意:初始化列表时用的
ContactModel构造方法接收三个参数(头像资源ID、姓名、号码),原有插入代码只传了两个参数,如果没有重载双参数构造方法会直接编译报错。
修复方案
修改确认按钮的点击逻辑,只有两个输入项全部校验通过时,才执行插入数据、刷新列表、关闭弹窗的操作,替换后代码如下:
btnAction.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 获取输入内容并去除首尾空白字符 String name = addTxtName.getText().toString().trim(); String number = addTxtNumber.getText().toString().trim(); boolean inputValid = true; if (name.isEmpty()) { Toast.makeText(MainActivity.this, "Please add a valid name", Toast.LENGTH_SHORT).show(); inputValid = false; } if (number.isEmpty()) { Toast.makeText(MainActivity.this, "Please add valid contact number", Toast.LENGTH_SHORT).show(); inputValid = false; } // 仅当输入全部合法时才执行新增逻辑 if (inputValid) { // 传入默认头像资源,和原有列表项构造参数保持一致 list.add(new ContactModel(R.drawable.ic_user, name, number)); adapter.notifyItemInserted(list.size() - 1); recyclerView.scrollToPosition(list.size() - 1); dialog.dismiss(); } } });
可选优化点
- 可以用Android官方工具类
TextUtils.isEmpty()代替手写的isEmpty()判断,该方法会自动处理null值,避免空指针异常 - 校验不通过时可以给对应输入框设置错误提示(
setError()),引导用户修正输入 - 可以额外增加号码长度校验,比如判断手机号长度是否符合规则,进一步提升输入合法性
内容的提问来源于stack exchange,提问作者kalyan roy
相关产品推荐
相关产品推荐

