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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:47:42