第127篇ViewPager2 与 Fragment:懒加载的正确实现
先把结论放在前面:ViewPager2 内部就是一个 RecyclerView,页面项由FragmentStateAdapter托管,Fragment 的生命周期由它按可见性自动触发。所以"RecyclerView 复用"的那套坑——itemViewType、getItemId、notifyDataSetChanged的抖动——在 ViewPager2 上同样存在,而且因为它同时管理着 Fragment 实例,坑的破坏力更大。ViewPager2 相比旧版 ViewPager 的改进不只是 API 变化,这题的坑都在边界上,逐个踩一遍才算真懂。先讲清它为什么换成了 RecyclerView旧版 ViewPager 的问题写在源码里:内部直接持有View列表和SparseArrayFragment,没有复用机制,页面多了会吃掉大量内存;还有一个 notorious 的 bug——必须setUserVisibleHint才能让内部 Fragment 感知可见性,于是开发者到处手动调setUserVisibleHint,与 FragmentManager 的可见性回调打架,表现为"加载两次"或"切回来还是旧数据"。ViewPager2 的做法是彻底换掉内核:内部用Recycle