安卓 ViewPager + Fragment 多次切换页面后页面空白
项目场景:
在写项目联系时总是出现ViewPager滑动空白,此前也通过度娘解决了很多次。这次系统性的写一下解决方式
问题描述
写完XML和Adapter,当你运行软件觉得一切顺利,但是在划拉两下之后就觉得不对劲…??这怎么,空白了!
原因分析:
动态加载Fragment,页面显示空白,就是onCreateView()方法每次都调用导致的,这样fragment每次都会设置新的View,并且之前的View并没有被回收,这就导致了新的View覆盖了旧的View,旧View不显示。
解决方案:
- 通过设置预加载页面数量解决,适用于页面复杂且数据量不大的方案
- 通过重写适配器的Destory方法限制Fragment的销毁
- 在父View当中移除旧View并重新加载View
第一种,也是最简单的一种: 通过设置预加载页面数量解决,适用于页面复杂且数据量不大的方案
viewPager.offscreenPageLimit = fragment.size
第二种 通过重写适配器的destroyItem方法,不调用超类的destroyItem方法从而限制Fragment的销毁。
viewPager.adapter = object :FragmentPagerAdapter(supportFragmentManager){
override fun getCount() = size
override fun getItem(position: Int): Fragment = get(position)
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
}
}
第三种 在onCreateView()中判断Fragment中是否已经添加了contentView,第一次加载时,可以将view保存下来,之后再加载时判断保存的view是否为空,如果为空,则return新加载的view,如果不为空,先将保存的view从父view中移除,然后再return该view。
protected var rootView: View? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
if (rootView != null){
rootView?.parent.apply{
this as ViewGroup
removeView(rootView)
}
return rootView
}
return LayoutInflater.from(context).inflate(getLayoutId(),null,false).also{
rootView = it
}
}
初学kotlin,如有勘误多多包涵
|