RecyclerView添加联系人点击按钮崩溃问题排查(附代码)
问题分析与修复
崩溃原因
崩溃日志显示NullPointerException,核心问题是点击添加按钮时调用adapter.notifyItemInserted()时,类的成员变量adapter并未完成初始化。
看代码细节:
- 你在类中声明了成员变量
RecyclerContactAdapter adapter; - 但在
onCreate方法中,你重新定义了一个同名的局部变量:
这导致成员变量RecyclerContactAdapter adapter = new RecyclerContactAdapter(this, arrContact);adapter始终处于null状态,而局部变量仅在onCreate方法内部有效。点击事件里访问的是未初始化的成员变量,最终触发空指针异常。
修复步骤
修正变量赋值逻辑:移除局部变量的定义,直接给成员变量
adapter赋值:// 去掉前面的RecyclerContactAdapter,直接使用类的成员变量 adapter = new RecyclerContactAdapter(this, arrContact); recyclerView.setAdapter(adapter);优化输入验证逻辑:当前逻辑下,即使姓名或号码为空,仍然会添加无效联系人。建议修改为只有当姓名和号码都不为空时,才执行添加操作:
btnActn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String name = edtname.getText().toString().trim(); String number = edtno.getText().toString().trim(); if(name.isEmpty()){ Toast.makeText(MainActivity.this, "请输入姓名", Toast.LENGTH_SHORT).show(); return; // 直接返回,终止后续操作 } if(number.isEmpty()){ Toast.makeText(MainActivity.this, "请输入号码", Toast.LENGTH_SHORT).show(); return; } // 验证通过后再添加联系人 arrContact.add(new ContactModel(name, number)); adapter.notifyItemInserted(arrContact.size()-1); recyclerView.scrollToPosition(arrContact.size()-1); dialog.dismiss(); } });
修复后的关键代码片段
public class MainActivity extends AppCompatActivity { ArrayList<ContactModel> arrContact = new ArrayList<>(); RecyclerContactAdapter adapter; RecyclerView recyclerView; FloatingActionButton btnOpndlg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.recycleContact); btnOpndlg = findViewById(R.id.btnopndlg); btnOpndlg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Dialog dialog = new Dialog(MainActivity.this); dialog.setContentView(R.layout.add_update); EditText edtname = dialog.findViewById(R.id.edtname); EditText edtno = dialog.findViewById(R.id.edtno); Button btnActn = dialog.findViewById(R.id.addbtn); btnActn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String name = edtname.getText().toString().trim(); String number = edtno.getText().toString().trim(); if(name.isEmpty()){ Toast.makeText(MainActivity.this, "请输入姓名", Toast.LENGTH_SHORT).show(); return; } if(number.isEmpty()){ Toast.makeText(MainActivity.this, "请输入号码", Toast.LENGTH_SHORT).show(); return; } arrContact.add(new ContactModel(name, number)); adapter.notifyItemInserted(arrContact.size()-1); recyclerView.scrollToPosition(arrContact.size()-1); dialog.dismiss(); } }); dialog.show(); } }); recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 初始化测试数据 arrContact.add(new ContactModel(R.drawable.ap,"Shank","908784836")); arrContact.add(new ContactModel(R.drawable.lp,"Luffy","908784836")); // ... 其他测试数据保持不变 ... // 修正:直接给成员变量adapter赋值 adapter = new RecyclerContactAdapter(this, arrContact); recyclerView.setAdapter(adapter); } }
内容的提问来源于stack exchange,提问作者THE Anonymous
相关产品推荐
相关产品推荐

