Kotlin新手求教:获取数据后如何正确设置RecyclerView Adapter?
问题修复方案
你的代码出现空列表的核心原因是数据加载的时序问题:你在onCreate中调用getActivity().loadObjects()时,Activity可能还未完全初始化,或者loadObjects()内部是异步加载(表面同步),导致resultList初始为空;调试断点时UI线程暂停,给了数据加载足够时间,所以列表能正常显示。下面是具体修复步骤:
修复后的代码
open class MyFragment : DialogFragment() { private var fragmentBinding: FragmentBinding? = null private lateinit var resultList: List<MyObject> private val list = mutableListOf<MyObjectItem>() private lateinit var adapter: MyAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { fragmentBinding = FragmentBinding.inflate(inflater, container, false) // 先初始化Adapter,提前绑定到RecyclerView initAdapter() lifecycleScope.launch { // 用requireActivity()确保拿到非空的Activity实例 resultList = requireActivity().loadObjects() getListData() // 通知Adapter数据已更新,触发UI刷新 adapter.notifyDataSetChanged() } return fragmentBinding?.root } private fun initAdapter() { val layoutManager = LinearLayoutManager(requireContext()) fragmentBinding?.recyclerView?.layoutManager = layoutManager adapter = MyAdapter(list, requireContext(), this, this) fragmentBinding?.recyclerView?.adapter = adapter } private fun getListData() { list.clear() // 避免重复加载时出现重复数据 for (value in resultList) { list.add( MyObjectItem( value.title!!, value.numbert!! ) ) } } override fun onDestroyView() { super.onDestroyView() fragmentBinding = null // 释放绑定,防止内存泄漏 } }
关键修改说明
- 提前初始化Adapter:在协程加载数据前就完成Adapter的创建和绑定,让RecyclerView先拿到Adapter实例,后续只需通知数据更新即可。
- 用requireActivity()替代getActivity():强制确保获取到非空的Activity,避免空指针异常。
- 数据加载后通知Adapter:调用
adapter.notifyDataSetChanged()告诉RecyclerView数据已更新,触发列表刷新。 - 清空列表再填充:防止重复执行数据加载时,列表出现重复条目。
- 添加绑定置空逻辑:在
onDestroyView()中将fragmentBinding设为null,避免内存泄漏。
额外优化建议
如果loadObjects()是耗时操作,建议把它改成挂起函数,放到IO线程执行,避免阻塞主线程:
// 在你的Activity中修改loadObjects()为挂起函数 suspend fun loadObjects(): List<MyObject> = withContext(Dispatchers.IO) { // 这里写耗时的数据加载逻辑,比如从数据库/网络获取数据 }
这样协程会自动切换到后台线程执行加载,完成后切回主线程更新UI,保证界面流畅。
内容的提问来源于stack exchange,提问作者Monica
相关产品推荐
相关产品推荐

