You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView添加联系人点击按钮崩溃问题排查(附代码)

问题分析与修复

崩溃原因

崩溃日志显示NullPointerException,核心问题是点击添加按钮时调用adapter.notifyItemInserted()时,类的成员变量adapter并未完成初始化。

看代码细节:

  • 你在类中声明了成员变量RecyclerContactAdapter adapter;
  • 但在onCreate方法中,你重新定义了一个同名的局部变量:
    RecyclerContactAdapter adapter = new RecyclerContactAdapter(this, arrContact);
    
    这导致成员变量adapter始终处于null状态,而局部变量仅在onCreate方法内部有效。点击事件里访问的是未初始化的成员变量,最终触发空指针异常。

修复步骤

  1. 修正变量赋值逻辑:移除局部变量的定义,直接给成员变量adapter赋值:

    // 去掉前面的RecyclerContactAdapter,直接使用类的成员变量
    adapter = new RecyclerContactAdapter(this, arrContact);
    recyclerView.setAdapter(adapter);
    
  2. 优化输入验证逻辑:当前逻辑下,即使姓名或号码为空,仍然会添加无效联系人。建议修改为只有当姓名和号码都不为空时,才执行添加操作:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:40:57