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
相关产品推荐
相关产品推荐

