Android ViewPager – 如何强制删除所有项目?

我正在编写一个Android应用程序,它广泛使用包含高分辨率图像的ViewPagers。 我正在扩展PagerAdapter并在适当时手动创建和销毁项目。 它工作正常,直到这个片段被放置在该堆栈上。 我想将ViewPagers中的片段放在堆栈上的时候从内存中删除所有的图片,但是我找不到方法。

我尝试从适配器使用的列表中删除所有的支持数据,然后调用.notifyDataSetChanged(),但是这不经过,并为每个页面调用PagerAdapter.destroyItem(),我希望。

我也尝试使用FragmentStatePagerAdapter,但是这也似乎没有清除应用程序使用过程中的任何内存。

我怎样才能强制一个PagerAdapter在呼叫器的所有项目上调用destroyItem()?

这是我包含ViewPager的View的代码:

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

PagerAdapter.destroyItem()不会被调用,因为PagerAdapter.destroyItem()的默认实现返回PagerAdapter.POSITION_UNCHANGED 。 所以,当你调用PagerAdapter.notifyDataSetChanged() ViewPager继续认为你删除的项目仍然存在,并不会摧毁它们。 您需要为从适配器中移除的每个项目返回PagerAdapter.POSITION_NONE