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
相关产品推荐
相关产品推荐

