RecyclerView删除Item后重复调用setAdapter报错求助
我来帮你梳理下删除Item后调用setAdapter时报错的几个常见原因,结合你给出的代码片段(比如定义了exercisesAdapter adapter和RecyclerView.Adapter mAdapter两个变量,还有Activity上下文),可以从这些方向排查:
空指针或数据源异常
这是最常见的情况:- 你删除Item后,给Adapter提供数据的ArrayList会不会不小心变成null了?或者删除操作后数据源索引混乱,导致Adapter初始化时出错?
- 另外你代码里有两个Adapter变量,会不会搞混了?比如你更新了
adapter的数据源,但调用setAdapter时用的是没初始化的mAdapter,直接触发空指针报错。 - 如果删除后数据源为空,别直接给RecyclerView设置null Adapter,要么给Adapter传空列表,要么做个空状态布局,不然很容易触发异常。
不在主线程调用UI操作
RecyclerView的所有UI操作必须在主线程执行!如果你的删除逻辑是在子线程(比如异步删除本地数据后)直接调用setAdapter,肯定会报错。一定要把recyclerView.setAdapter(...)放到runOnUiThread里,或者用Handler切换到主线程执行。RecyclerView实例失效
比如Activity已经进入销毁状态(比如屏幕旋转、用户按返回键),但你还持有旧的RecyclerView实例,这时候调用setAdapter就会触发IllegalStateException。调用前可以先检查下recyclerView != null,并且确认Activity还处于活跃状态(比如!isFinishing())。Adapter更新方式不规范
很多人删除Item后习惯直接new一个新的Adapter然后setAdapter,但其实更稳妥的是复用原Adapter:更新原Adapter的数据源后,调用adapter.notifyItemRemoved(position)或者adapter.notifyDataSetChanged()。如果每次都new Adapter,很可能在初始化时传入了错误的参数(比如空的上下文、null数据源),进而在setAdapter时触发错误。上下文引用失效
你代码里定义了Context context = mainScreen.this;,如果删除操作是在某个延迟回调里执行的,这时候Activity可能已经被销毁,上下文失效,导致Adapter初始化失败,最终在setAdapter时报错。建议不要持有Activity的强引用,或者使用getApplicationContext()(如果Adapter允许的话)。
快速排查小技巧
- 先看报错的具体栈信息!是空指针?还是非法状态异常?不同的错误指向不同的问题。
- 删除Item后打印数据源的size和内容,确认数据是正确的。
- 在调用setAdapter前打印当前线程,确保是main线程。
- 尽量复用原Adapter,减少不必要的setAdapter操作,用notify系列方法更新列表。
内容的提问来源于stack exchange,提问作者Adir

