Fragment绑定场景下ListView选中项Toast提示导致应用崩溃问题
解决ListView点击弹出Toast崩溃的问题
嘿,我帮你找到了代码崩溃的原因:默认情况下,ListView的selectedItem属性并不会在你点击Item时自动赋值,所以你调用binding.listview.selectedItem.toString()时,selectedItem其实是null,直接调用toString()就触发了空指针异常(NullPointerException),这就是应用崩溃的根源。
下面给你两种靠谱的实现方式,按需选择:
方式一:通过点击回调的position直接取数据(推荐)
既然OnItemClickListener的回调已经给了你position参数,直接用它从你的数据源tableros列表里拿对应内容就好,这是最直接高效的方式:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding = FragmentPrimerBinding.bind(view) // 直接用listOf创建固定列表,不用绕mutableListOf再转list val tableros = listOf("3x4","3x7","3x8","3x9","3x10","4x5","4x6","4x7","4x8","4x9","5x5","5x6","5x7","5x8","5x9") // 用?:替代!!,避免潜在空指针,更安全 val arrayAdapter = context?.let { ArrayAdapter(it.applicationContext, android.R.layout.simple_list_item_1, tableros) } ?: throw IllegalStateException("Context 不能为空") binding.listview.adapter = arrayAdapter binding.listview.setOnItemClickListener { parent, view, position, id -> // 直接通过position从数据源获取选中项 val selectedContent = tableros[position] // 用requireContext()就足够,不用额外加applicationContext Toast.makeText(requireContext(), selectedContent, Toast.LENGTH_LONG).show() } }
方式二:设置选择模式后使用selectedItem
如果你确实想通过selectedItem来获取内容,得先给ListView设置选择模式,比如单选模式,这样点击Item时才会自动标记选中状态:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding = FragmentPrimerBinding.bind(view) val tableros = listOf("3x4","3x7","3x8","3x9","3x10","4x5","4x6","4x7","4x8","4x9","5x5","5x6","5x7","5x8","5x9") val arrayAdapter = context?.let { // 用simple_list_item_activated_1布局,选中时会有高亮效果 ArrayAdapter(it.applicationContext, android.R.layout.simple_list_item_activated_1, tableros) } ?: throw IllegalStateException("Context 不能为空") // 必须设置单选模式,否则selectedItem始终为null binding.listview.choiceMode = ListView.CHOICE_MODE_SINGLE binding.listview.adapter = arrayAdapter binding.listview.setOnItemClickListener { parent, view, position, id -> // 这里要加空判断,避免极端情况出现null val selectedContent = binding.listview.selectedItem?.toString() ?: "未选中任何项" Toast.makeText(requireContext(), selectedContent, Toast.LENGTH_LONG).show() } }
内容的提问来源于stack exchange,提问作者MeowYOU
相关产品推荐
相关产品推荐

