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()
}

博客探讨了如何在Android中手动释放ViewPager内的Fragment。通过自定义Adapter并调整destroyItem回调,确保仅在界面销毁时执行Fragment的释放操作。同时,文章介绍了使用反射来遍历并销毁adapter中缓存的所有Fragment。
437

被折叠的 条评论
为什么被折叠?



