我正在编写一个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()
的默认实现返回Psger.getItemPosition()
,因此未调用PagerAdapter.POSITION_UNCHANGED
。因此,当您调用PagerAdapter.notifyDataSetChanged()
时,ViewPager
继续认为您删除的项目仍然存在,并且不会销毁它们。您需要为从适配器中删除的每个项目返回PagerAdapter.POSITION_NONE
。
关于android - Android ViewPager-如何强制删除所有项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34934126/