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

ListView问题:仅显示首个元素,点击添加按钮后后续元素不展示

解决ListView仅显示第一个元素的问题

问题根源

你的代码存在几个关键问题导致后续元素无法显示:

  • 同时操作原始数据源loadApplianceList和适配器内部数据集,导致数据状态不一致
  • 字符串拼接中使用了未定义的大写变量Quantity,会引发编译错误(若未报错大概率是笔误)
  • 适配器是onViewCreated内的局部变量,虽当前闭包可访问,但存在潜在生命周期风险且不利于后续维护

修复方案

  1. 将适配器声明为类成员变量,确保在Fragment整个生命周期内可稳定访问
  2. 统一数据源操作逻辑:二选一即可,不要同时执行
    • 操作原始列表后通知适配器更新
    • 直接调用适配器的add()方法(内部会自动触发更新)
  3. 修正变量名拼写错误

修改后的完整代码

class DHouseFragment : Fragment() {

    private var _binding: FragmentDwellingsBinding? = null
    private val binding get() = _binding!!

    private val load = Loads()
    private val loadApplianceList: MutableList<String> = mutableListOf()
    // 将适配器提升为类成员变量
    private lateinit var adapter: ArrayAdapter<String>
        
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            // 处理参数逻辑
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentDBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // 初始化适配器并绑定到ListView
        adapter = ArrayAdapter<String>(binding.root.context, R.layout.simple_list_item_1, loadApplianceList)
        binding.listAppList.adapter = adapter

        binding.buttonAddNewLoad.setOnClickListener{
            load.addLoad(loadTypeSelected, quantity.toInt(), power.toFloat(), description)
            
            // 方案一:操作原始数据源,手动通知适配器更新
            loadApplianceList.add("Quantity - $quantity")
            adapter.notifyDataSetChanged()

            // 方案二:直接调用适配器的add方法,无需手动调用notifyDataSetChanged
            // adapter.add("Quantity - $quantity")
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

额外说明

  • 若选择方案二(直接调用adapter.add()),无需手动调用notifyDataSetChanged(),ArrayAdapter的add()方法内部已封装了数据更新通知逻辑
  • 确保quantity、loadTypeSelected、power、description这些变量在点击事件中是可访问的有效变量,避免空值或未初始化问题

内容的提问来源于stack exchange,提问作者Julián Oviedo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:09:53