ListView问题:仅显示首个元素,点击添加按钮后后续元素不展示
解决ListView仅显示第一个元素的问题
问题根源
你的代码存在几个关键问题导致后续元素无法显示:
- 同时操作原始数据源
loadApplianceList和适配器内部数据集,导致数据状态不一致 - 字符串拼接中使用了未定义的大写变量
Quantity,会引发编译错误(若未报错大概率是笔误) - 适配器是
onViewCreated内的局部变量,虽当前闭包可访问,但存在潜在生命周期风险且不利于后续维护
修复方案
- 将适配器声明为类成员变量,确保在Fragment整个生命周期内可稳定访问
- 统一数据源操作逻辑:二选一即可,不要同时执行
- 操作原始列表后通知适配器更新
- 直接调用适配器的
add()方法(内部会自动触发更新)
- 修正变量名拼写错误
修改后的完整代码
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
相关产品推荐
相关产品推荐

