Android Fragment中调用RecyclerView.setAdapter空指针崩溃是什么原因
问题根因
报错核心是RecyclerView对象为空时调用了setAdapter方法,触发空指针异常。
你将GetData方法放在了Fragment的onCreate生命周期回调中执行,而Fragment的onCreate阶段仅完成Fragment自身的实例创建,还未加载布局视图,此时无法通过findViewById绑定到布局中的RecyclerView控件,导致对象为空。
相同逻辑在Activity中可正常运行,是因为Activity的onCreate阶段执行setContentView后就可以完成布局控件的查找绑定,生命周期逻辑和Fragment存在差异。
修复方案
调整逻辑执行的生命周期节点即可解决问题,具体操作如下:
- 移除
onCreate方法中的GetData调用 - 将RecyclerView的初始化绑定、数据加载逻辑都放到
onViewCreated回调中执行,该回调触发时Fragment的布局已经加载完成,可以正常找到对应控件
代码示例
public class ContactsFragment extends Fragment { // 声明全局的RecyclerView对象 private RecyclerView mRecyclerView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 删掉此处的GetData调用 } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // 加载Fragment对应的布局文件 return inflater.inflate(R.layout.fragment_contacts, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 先完成RecyclerView的绑定和基础配置 mRecyclerView = view.findViewById(R.id.contacts_recycler); // 必须设置布局管理器,否则RecyclerView也无法正常工作 mRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); // 初始化完成后再调用GetData加载数据、设置适配器 GetData(); } private void GetData() { // 你的读取联系人、设置Adapter的原有逻辑,直接使用已经初始化的mRecyclerView即可 // mRecyclerView.setAdapter(yourAdapter); } }
注意事项
- 确保
GetData方法中调用setAdapter的RecyclerView对象,是已经在onViewCreated中完成初始化的全局对象,不要重复声明局部同名对象导致全局对象仍为空 - 读取系统联系人需要动态申请
READ_CONTACTS权限,建议在权限申请通过后再执行GetData方法加载数据
内容的提问来源于stack exchange,提问作者Janith Anjana
相关产品推荐
相关产品推荐

