Android ViewPager-如何强制删除所有项目?
我正在编写一个Android应用程序,它广泛使用包含高分辨率图像的ViewPager。我正在扩展PagerAdapter,并在适当的时候手动创建和销毁物品。直到这个碎片被放在后面,它才能正常工作。我想在带有ViewPagers的片段放在后台时从内存中删除所有图像,但我想不出一个方法 我尝试从适配器使用的列表中删除所有支持数据,然后调用.notifyDataSetChanged(),但这并没有像我希望的那样,为每个页面调用PagerAdapter.destroyItem() 我也尝试过使用FragmentStatePagerAdapter,但在应用程序使用过程中,这似乎也没有清除任何内存 如何强制PagerAdapter对寻呼机中的所有项目调用destroyItem() 以下是包含ViewPager的视图的代码:Android ViewPager-如何强制删除所有项目?,android,android-fragments,android-viewpager,kotlin,Android,Android Fragments,Android Viewpager,Kotlin,我正在编写一个Android应用程序,它广泛使用包含高分辨率图像的ViewPager。我正在扩展PagerAdapter,并在适当的时候手动创建和销毁物品。直到这个碎片被放在后面,它才能正常工作。我想在带有ViewPagers的片段放在后台时从内存中删除所有图像,但我想不出一个方法 我尝试从适配器使用的列表中删除所有支持数据,然后调用.notifyDataSetChanged(),但这并没有像我希望的那样,为每个页面调用PagerAdapter.destroyItem() 我也尝试过使用Frag
class ContentStrip : LinearLayout {
var title : WeakReference<TextView>? = null
var titleString: String = ""
lateinit var pager : WeakReference<MyViewPager>
var data:ContentCollection? = null
//[...] other view methods
//Called from parent fragment's onDestroy
fun clearMemory() {
if (data == null) return
var i = -1
var contentItem : ContentItem
for(item in data!!.contentItems) {
i++
var v:View? = pager.get().findViewWithTag("${titleString}$i") ?: continue
contentItem = v as ContentItem
contentItem.image?.setImageDrawable(null)
contentItem.image = null
removeView(contentItem)
}
title = null
pager.get().removeAllViews()
data?.contentItems?.clear()
pager.get().adapter.notifyDataSetChanged()
invalidate()
}
class ContentStripAdapter() : PagerAdapter() {
lateinit var outer: WeakReference<ContentStrip>
fun setOuterRef(cs:ContentStrip) : ContentStripAdapter {
outer = WeakReference(cs)
return this
}
//[...]other PagerAdapter methods
override fun destroyItem (container:ViewGroup, position:Int, obj:Any) {
var img : ContentItem? = obj as ContentItem
img?.image?.setImageDrawable(null)
img?.image = null
img?.title = null
container.removeView(img)
img = null
}
override fun getCount(): Int {
return outer.get().data?.contentItems?.count()!!
}
}
}
class ContentStrip:LinearLayout{
变量标题:WeakReference?=null
var titleString:String=“”
lateinit变量寻呼机:WeakReference
变量数据:ContentCollection?=null
//[…]其他视图方法
//从父片段的onDestroy调用
有趣的clearMemory(){
如果(数据==null)返回
变量i=-1
var contentItem:contentItem
用于(数据中的项!!.contentItems){
我++
var v:View?=pager.get().findViewWithTag(“${titleString}$i”):继续
contentItem=v作为contentItem
contentItem.image?.setImageDrawable(空)
contentItem.image=null
removeView(contentItem)
}
title=null
pager.get().removeAllViews()
数据?.contentItems?.clear()
pager.get().adapter.notifyDataSetChanged()
使无效
}
类ContentStripAdapter():PagerAdapter(){
lateinit变量外部:WeakReference
fun setOuterRef(cs:ContentStrip):ContentStripAdapter{
外部=弱引用(cs)
还这个
}
//[…]其他PagerAdapter方法
覆盖项目(容器:视图组,位置:Int,对象:Any){
var img:ContentItem?=对象作为ContentItem
img?.image?.setImageDrawable(空)
img?.image=null
img?.title=null
container.removeView(img)
img=null
}
重写fun getCount():Int{
返回outer.get().data?.contentItems?.count()!!
}
}
}
PagerAdapter.destroyItem()
未被调用,因为Psger.getItemPosition()
的默认实现返回PagerAdapter.POSITION\u未更改。因此,当您调用PagerAdapter.notifyDataSetChanged()
ViewPager
时,仍然认为您删除的项目仍然存在,并且不会销毁它们。您需要为从适配器中删除的每个项目返回PagerAdapter.POSITION\u NONE
。能否尝试在viewpager中使用简单视图而不是片段?我的一个项目和imageView.setImageDrawable(null)中也有类似的问题;为我工作。但是片段是不需要的,所以我只使用了一个带有ImageView和TextView的视图组。尝试使用FragmentStatePager适配器,在getItemPosition方法上只返回POSITION\u NONE。调用PagerAdapter.POSITION\u NONE
如果其他视图不需要重新实例化,这不是一个好的解决方案。没有重新实例化PagerAdapter
还有其他解决方案吗?我们可以实现吗?您必须仅为要删除的项目返回POSITION_NONE
。是的,我正在为要从视图寻呼机中删除的选定项目返回POSITION_NONE
,但它再次重新实例化PagerAdapter,即寻呼机适配器重置。