Kotlin Fragment中lateinit属性groupList未初始化问题求助
解决ExpandableListView适配器lateinit未初始化错误
问题核心是你在使用groupList和childList这两个lateinit变量创建适配器时,它们还没有被赋值。lateinit修饰的变量必须在首次使用前完成初始化,否则就会抛出lateinit property has not been initialized错误。
修复步骤:
- 先初始化集合数据,再创建适配器:在调用
ListViewAdapter构造函数之前,必须给groupList和childList赋值具体的集合数据。 - 适配Fragment生命周期:如果数据需要异步加载(比如网络请求、数据库查询),建议在
onViewCreated中处理,或者通过观察数据变化来触发适配器初始化。
修改后的示例代码:
class MyClass: Fragment() { private lateinit var listAdapter: YearListViewAdapter private lateinit var groupList: List<String> private lateinit var childList: HashMap<String, List<String>> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 1. 先初始化分组和子项数据 initData() // 2. 再创建适配器并设置 listAdapter = YearListViewAdapter(this, groupList, childList) yearGoalList.setAdapter(listAdapter) } // 初始化模拟数据,实际项目中替换为真实数据源 private fun initData() { groupList = listOf("2023", "2024", "2025") childList = hashMapOf( "2023" to listOf("Q1目标", "Q2目标"), "2024" to listOf("Q1目标", "Q2目标", "Q3目标"), "2025" to listOf("年度总目标") ) } }
额外注意事项:
- 如果你的数据是异步加载的,不要在
onCreate中直接初始化适配器,应该在数据加载完成的回调里(比如网络请求成功后)给groupList和childList赋值,再创建适配器或者调用notifyDataSetChanged()更新数据。 - 避免拼写错误:你的代码里出现了
yearListAdapter和ListAdapter两个不同的变量名,要确保变量名一致(示例中统一为listAdapter)。
内容的提问来源于stack exchange,提问作者J. Weidenhagen
相关产品推荐
相关产品推荐

