Android调用RecyclerView.removeViewAt空对象引用报错如何解决
问题根本原因
- 存在变量遮蔽问题:你在
onCreate方法中局部声明了RecyclerView recyclerView变量,仅在onCreate作用域内有效,类全局的recyclerView成员变量并未被赋值初始化,其他方法调用时该变量为null,触发空指针异常。 - 列表操作逻辑不符合规范:直接调用
RecyclerView.removeViewAt()直接操作控件子View,没有同步修改数据源,后续会出现列表显示异常;同时误用notifyAll()方法(该方法是Java线程间通信的API,和RecyclerView列表刷新完全无关)。
修复步骤
- 调整RecyclerView变量声明,避免变量遮蔽
将RecyclerView声明为Activity的全局成员变量,在onCreate中直接赋值而非重新声明局部变量:
public class FavoriteFullImageActivity extends AppCompatActivity { // 顶部声明全局成员变量 private RecyclerView recyclerView; // 补充其他必要的成员变量,比如数据源List、Adapter、DbHelper等 private List<你的数据类型> dataList; private 你的Adapter类 adapter; private MyDbHelper myDbHelper; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_favorite_full_image); getSupportActionBar().hide(); // 直接给全局变量赋值,不要加前面的RecyclerView类型声明 recyclerView = findViewById(R.id.FavoriteCategoryView); // 补充RecyclerView必要的初始化配置,缺少这步也会导致列表不显示 recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 初始化数据源和Adapter dataList = 你的数据源获取逻辑(); adapter = new 你的Adapter类(dataList); recyclerView.setAdapter(adapter); } }
- 修正列表项删除逻辑
try { // 先做有效性校验,避免下标越界、空指针问题 if (recyclerView == null || adapter == null || position < 0 || position >= dataList.size()) { return; } // 1. 先删除对应位置的数据源 dataList.remove(position); // 2. 通知Adapter指定位置数据被删除,触发定向刷新 adapter.notifyItemRemoved(position); // 执行数据库操作 myDbHelper.closeDb(); myDbHelper.close(); } catch (NullPointerException e) { e.printStackTrace(); }
额外注意事项
- 不要直接调用RecyclerView的
addView/removeView等方法操作子View,所有列表变化都要先修改数据源,再通过Adapter的notify系列方法刷新。 - 不要随意调用
notifyAll()方法,该方法和列表刷新没有任何关联,是用于Java多线程等待唤醒机制的API。
内容的提问来源于stack exchange,提问作者andrey1004
相关产品推荐
相关产品推荐

