Android开发求助:BlankFragment中RecyclerView初始化崩溃问题
你这是踩了Android开发新手很容易犯的一个典型错误——在Activity里试图查找Fragment布局中的控件,这肯定找不到啊!
问题根源
你的RecyclerView明明定义在fragment_blank.xml这个Fragment的布局文件里,但你却在MainActivity的onCreate方法里调用findViewById(R.id.recyclerview_id)来获取它。Activity的findViewById只会在当前Activity自己的布局文件里搜索控件,完全找不到Fragment布局里的元素,所以myrv变量会变成null,调用myrv.setLayoutManager()自然就触发空指针异常了。
正确解决方案:把RecyclerView的初始化逻辑移到BlankFragment中
Fragment有自己独立的生命周期,我们应该在Fragment的onViewCreated方法(或者onCreateView返回View之后)来初始化RecyclerView,这样才能正确获取到Fragment布局里的控件。
修改你的BlankFragment代码,示例如下:
public class BlankFragment extends Fragment { private ArrayList<Tovar_tavsiya> lstTovar; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 加载Fragment的布局 return inflater.inflate(R.layout.fragment_blank, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 初始化数据源 lstTovar = new ArrayList<>(); lstTovar.add(new Tovar_tavsiya("Modadagi kiyimlar", "Tovar kategoriyasi", "Description", R.drawable.tile_bg_1)); lstTovar.add(new Tovar_tavsiya("Chet eldan uskunalar", "Tovar kategoriyasi", "Description", R.drawable.tile_bg_2)); lstTovar.add(new Tovar_tavsiya("Tekstil mahsulotlari", "Tovar kategoriyasi", "Description", R.drawable.tile_bg_3)); // 通过Fragment的根View获取RecyclerView RecyclerView myrv = view.findViewById(R.id.recyclerview_id); Recyclerview_Adapter myrv_Adapter = new Recyclerview_Adapter(getContext(), lstTovar); myrv.setLayoutManager(new GridLayoutManager(getContext(), 3)); myrv.setAdapter(myrv_Adapter); } }
同时记得把MainActivity里第46行附近的RecyclerView相关代码全部删除,避免重复初始化。
补充说明:为什么不能在Activity里找Fragment的控件?
Fragment的布局是在Fragment的onCreateView方法执行时才会被加载到Activity的布局结构里,在Activity的onCreate执行阶段,Fragment可能还没完成布局加载;就算加载完成了,Activity的findViewById也无法直接穿透到Fragment的View层级——每个Fragment都有自己独立的View树,必须通过Fragment的根View才能查找内部控件。
这样修改后,你的RecyclerView就能正常初始化,程序也不会崩溃了。如果还有其他问题,可以继续补充相关代码片段~
内容的提问来源于stack exchange,提问作者Ganz Alex

