RecyclerView点击弹Toast崩溃:Context空指针异常求助
问题根源
崩溃的核心原因是Adapter中的Context为null:在MainActivity的onCreate方法中,你先创建了DetailsAdapter并传入了未初始化的context变量(此时它的值是null),之后才给context赋值,导致Adapter内部保存的Context始终是null,调用Toast.makeText时触发空指针异常。
解决方法
有两种可靠的修复方式,任选其一即可:
方法1:提前初始化Context再创建Adapter
修改MainActivity的onCreate方法,先完成Context初始化,再创建Adapter:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); recyclerView = findViewById(R.id.recyclerview); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); // 先初始化context context = getApplicationContext(); // 传入已初始化的context创建Adapter detailsAdapter = new DetailsAdapter(detailsList, context); recyclerView.setAdapter(detailsAdapter); getDetails(); }
或者更简化,直接传入this(MainActivity本身就是Context实例),无需单独定义context变量:
// 删除MainActivity中的Context context;声明 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); recyclerView = findViewById(R.id.recyclerview); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); // 直接传入this作为Context detailsAdapter = new DetailsAdapter(detailsList, this); recyclerView.setAdapter(detailsAdapter); getDetails(); }
方法2:使用View自带的Context(更推荐)
不依赖Adapter保存的Context,直接从点击的View中获取有效Context,既避免空指针,也能降低内存泄漏风险:
修改DetailsAdapter中onBindViewHolder的点击事件代码:
holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 使用view.getContext()获取当前有效Context Toast.makeText(view.getContext(), "item clicked!!", Toast.LENGTH_SHORT).show(); } });
内容的提问来源于stack exchange,提问作者Subhashana.S
相关产品推荐
相关产品推荐

