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

Fragment中RecyclerView报‘No adapter attached’警告的解决方法

解决RecyclerView "No adapter attached; skipping layout" 警告

问题原因

当前代码中,你仅在kanjiViewModel.kanjiList的观察者回调里为RecyclerView设置adapter,但LiveData的数据回调是异步的——Fragment初始化RecyclerView后,LiveData还未返回数据的这段时间里,RecyclerView已经开始执行布局流程,发现未绑定adapter,就会抛出该警告。虽然后续数据返回后能正常显示,但警告源于布局时机早于adapter绑定时机。

解决办法

在初始化RecyclerView的阶段(initUI方法内)就直接给两个RecyclerView绑定adapter,数据更新时仅调用submitList更新adapter的数据即可,无需重复设置adapter。

修改后的代码示例

class SpacedFragment : Fragment() {
    private lateinit var kanjiViewModel : KanjiViewModel
    private lateinit var spacedRecyclerAdapter : SpacedRecyclerAdapter
    private lateinit var day1Adapter: SpacedRecyclerAdapter
    private var _binding : FragmentSpacedBinding? = null
    private val binding get() = _binding!!
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View {
        _binding = FragmentSpacedBinding.inflate(inflater,container,false)
        return binding.root
    }

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

    private fun initUI() {
        val dao = KanjiDatabase.getInstance(requireContext()).dao()
        val repository = KanjiRepository(dao)
        val factory = KanjiViewModelFactory(repository)
        kanjiViewModel = ViewModelProvider(this,factory)[KanjiViewModel::class.java]
        
        // 初始化adapter
        spacedRecyclerAdapter = SpacedRecyclerAdapter()
        day1Adapter = SpacedRecyclerAdapter()
        
        // 绑定layoutManager和adapter
        binding.spacedRecyclerview.apply {
            layoutManager = GridLayoutManager(context,5)
            adapter = spacedRecyclerAdapter
        }
        
        binding.spacedRecyclerviewDay1.apply {
            layoutManager = GridLayoutManager(context,5)
            adapter = day1Adapter
        }
        
        getData()
    }

    private fun getData() {
        kanjiViewModel.kanjiList.observe(viewLifecycleOwner, { data ->
            // 仅更新数据集合
            spacedRecyclerAdapter.submitList(data.filter { it.spacedstatus == 0 })
            day1Adapter.submitList(data.filter { it.Japanese_Language_Proficiency_Test == 4 })
        })
    }
    
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

额外说明

  • 该做法符合RecyclerView的使用规范:adapter应在RecyclerView布局前完成绑定,后续仅更新数据集合即可,既避免警告也能减少不必要的布局刷新。
  • 重复设置adapter可能引发潜在的性能问题或布局异常,仅更新数据是更高效的操作方式。

内容的提问来源于stack exchange,提问作者Bradboyee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:36:15