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

Android空指针异常求助:GridView.setAdapter调用失败(导航栏Activity)

空指针异常排查与修复方案

异常根源分析

你遇到的空指针异常是因为GridView对象为null时调用了setAdapter方法,具体问题有两个:

  • 布局加载顺序错误:onCreate中先调用了findViewById(R.id.myGrid),但此时还未执行setContentView(binding.getRoot()),布局尚未加载到Activity中,导致gridView无法获取到实例。
  • Adapter初始化错误:创建ImageAdapter时重复嵌套实例化,写法new ImageAdapter(new ImageAdapter(mImageIds,this))完全错误,会导致Adapter无法正常工作。

修复后的完整代码

public class Sbbu_App extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;
    private ActivitySbbuAppBinding binding;

    ArrayList<Integer> mImageIds = new ArrayList<>(Arrays.asList(
            R.drawable.logo,R.drawable.gradient,R.drawable.dr, R.drawable.logo,R.drawable.gradient,
            R.drawable.logo,R.drawable.gradient,R.drawable.dr, R.drawable.logo,R.drawable.gradient,
            R.drawable.logo,R.drawable.gradient,R.drawable.dr, R.drawable.logo,R.drawable.gradient
    ));

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 先初始化ViewBinding并设置布局,确保控件能被找到
        binding = ActivitySbbuAppBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        // 通过ViewBinding获取GridView实例(替代findViewById,更安全)
        GridView gridView = binding.myGrid;
        // 正确初始化Adapter,去掉嵌套实例化的错误写法
        gridView.setAdapter(new ImageAdapter(mImageIds, this));

        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                int item_pos = mImageIds.get(position);
                // 补充调用对话框方法,否则点击事件无实际作用
                ShowDialougeBox(item_pos);
            }
        });

        setSupportActionBar(binding.appBarSbbuApp.toolbar);

        DrawerLayout drawer = binding.drawerLayout;
        NavigationView navigationView = binding.navView;
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.ABOUT_SBBU, R.id.nav_gallery, R.id.Academics, R.id.login, R.id.newsEvents)
                .setOpenableLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_sbbu_app);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    public void ShowDialougeBox(int item_pos){
        Dialog dialog = new Dialog(this);
        dialog.setContentView(R.layout.custome_dialog);

        TextView Image_name = dialog.findViewById(R.id.txt_Image_name);
        ImageView Image = dialog.findViewById(R.id.img);
        Button btn_Full = dialog.findViewById(R.id.btn_full);
        Button btn_Close = dialog.findViewById(R.id.btn_close);

        String title = getResources().getResourceName(item_pos);
        int index = title.indexOf("/");
        String name = title.substring(index+1,title.length());
        Image_name.setText(name);
        // 补充设置对话框内的图片显示
        Image.setImageResource(item_pos);

        btn_Close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
            }
        });
        btn_Full.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Sbbu_App.this, FullView.class);
                i.putExtra("img_id",item_pos);
                startActivity(i);
            }
        });
        dialog.show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.sbbu__app, menu);
        return true;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_sbbu_app);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }
}

额外优化提示

  • 使用ViewBinding获取控件时,确保布局中GridView的id为myGrid,对应自动生成的binding属性名。
  • 补充了点击事件中调用对话框的逻辑,以及对话框内ImageView的图片设置,让功能完整可用。

内容的提问来源于stack exchange,提问作者Saba Akram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:48:58