1、问题?

图片.png
当我们的tab很多时,我们的项目是13个tab,直接创建13个fragment,app内存爆满,APP崩溃了,所以我们要考虑懒加载的方式。
注意:当我们的页面tab比较少时,APP不会崩溃的。
老的方式:
//初始化fragment(随便写2个,真实的项目是13个fragment)
val fragmentList = arrayListOf<Fragment>()
fragmentList.add(BookshelfFragment())
fragmentList.add(BookshelfFragment())
private val fragmentAdapter: FragmentStateAdapter by lazy {
object : FragmentStateAdapter(this) {
override fun getItemCount(): Int {
return tabNames.size
}
override fun createFragment(position: Int): Fragment {
return fragmentList.get(position)
}
}
}
分析崩溃的原因: FragmentStateAdapter 中创建的fragment,会被回收销毁,所以下次再用到的时候,可能被销会了。
2、解决:
/**
* viewPager adapter
*/
var fragment: Fragment? = null
private val fragmentAdapter: FragmentStateAdapter by lazy {
object : FragmentStateAdapter(this) {
override fun getItemCount(): Int {
return tabNames.size
}
override fun createFragment(position: Int): Fragment {
when (position) {
0 -> {
//书架
fragment = BookshelfFragment().apply {
arguments?.apply {
putInt("type", 1)
}
}
}
1 -> {
//书城
fragment = NewBookCityFragment().apply {
arguments?.apply {
putInt("type", 2)
}
}
}
2 -> {
//我的
fragment = NewMineFragment().apply {
arguments?.apply {
putInt("type", 4)
}
}
}
}
return fragment!!
}
}
}
分析:在createFragment中,我们把需要的页面去创建fragment,不需要的时候去销毁,不用我们手动管理fragment。
注意:我们不要创建fragmentList 去管理fragment了。
从源码上看当使用 FragmentStatePagerAdapter 时,如果Fragment不显示,那么Fragment对象会被销毁,但在回调onDestroy()方法之前会回调onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来, FragmentStatePagerAdapter 比较适合页面比较多的情况,像一个页面的ListView item