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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:48:06