使用Kotlin为Fragment添加GridView触发NPE错误,组件无法填充数据
问题根源
你在HomeFragment中启用了ViewBinding,但访问GridView控件时未通过绑定实例binding调用,直接使用控件IDcardview_grid无法获取到Fragment布局中的控件实例,对象为空调用setAdapter就会触发空指针异常。
修复方案
- 核心修改:调整
onCreateView中GridView的adapter赋值逻辑,通过binding访问控件:
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java) _binding = FragmentHomeBinding.inflate(inflater, container, false) arrayList = ArrayList<Item>() arrayList.add(Item("Copacabana", R.drawable.item_copacabana_image, "19")) // 用requireActivity替代activity,避免上下文空指针 adapterHome = ItemAdapter_home(requireActivity(), arrayList) // 新增binding前缀,通过ViewBinding实例访问控件 binding.cardview_grid.adapter = adapterHome return binding.root }
- 额外优化点,避免后续出现其他崩溃:
- 修复适配器
getItem方法的错误逻辑,原逻辑返回position,应返回对应位置的Item数据:
override fun getItem(position: Int): Any = list[position]
- 适配器的
getView方法复用convertView减少性能消耗,避免每次都inflate新布局,同时不要用!!强转上下文:
override fun getView(p0: Int, convertView: View?, p2: ViewGroup): View { val item = list[p0] val view = convertView ?: LayoutInflater.from(ctx).inflate(R.layout.grid_item, p2, false) view.prog_img_home.setImageResource(item.prog_img_home) view.prog_name_home.text = item.prog_name_home view.nb_clap_home.text = item.nb_clap_home return view }
内容的提问来源于stack exchange,提问作者b4tos4i
相关产品推荐
相关产品推荐

