You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发求助:BlankFragment中RecyclerView初始化崩溃问题

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:43:18