Android 手动释放viewpager中的所有fragment
程序员文章站
2022-03-27 12:09:15
adapter的源码如下,destroyItem回调经过处理,滑动的时候不销毁,viewpager所在界面销毁的时候才让super执行:class FigViewPagerAdapter( fm: FragmentManager?, fragments: List, mtitles: Array? = null) : FragmentStatePagerAdapter(fm!!) { var mFragm....
adapter的源码如下,destroyItem回调经过处理,滑动的时候不销毁 ,viewpager所在界面销毁的时候才让super执行:
class FigViewPagerAdapter(
fm: FragmentManager?,
fragments: List<Fragment>,
mtitles: Array<String?>? = null
) : FragmentStatePagerAdapter(fm!!) {
var mFragments: List<Fragment> =
ArrayList()
var isCanRemove = false
override fun getItem(position: Int): Fragment {
return mFragments[position]
}
override fun getCount(): Int {
return mFragments.size
}
override fun getPageTitle(position: Int): CharSequence? {
return ""
}
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
//ページは破棄されません
if (isCanRemove) {
super.destroyItem(container, position, `object`)
}
}
init {
mFragments = fragments
}
}
通过反射的方法,在内存中找到adapter中所有mFragments变量的具体Fragment,然后销毁:
override fun onDestroyView() {
try {
val field: Field =
figViewPagerAdapter?.javaClass?.superclass?.getDeclaredField("mFragments")!!
field.isAccessible = true
val mFragments: ArrayList<Fragment> =
field[figViewPagerAdapter] as ArrayList<Fragment> //false 则是不关闭mFragments
if (mFragments != null) {
figViewPagerAdapter?.isCanRemove = true
for (i in mFragments.indices) {
figViewPagerAdapter?.destroyItem(
dataBinding.viewPager,
i,
mFragments[i]
)
}
figViewPagerAdapter?.finishUpdate(dataBinding.viewPager) //提交事务
}
} catch (e: Exception) {
}
super.onDestroyView()
figViewModel.clearPartListEvent()
}
本文地址:https://blog.csdn.net/Crystal_xing/article/details/107143033
上一篇: 手机自带变声器 效果好到队友都被骗了
下一篇: 正则表达式高级学习技巧