我正在編寫一個Android應用程序,它廣泛使用包含高分辨率圖像的ViewPagers。我正在擴展PagerAdapter並在適當時手動創建和銷燬項目。它工作正常,直到這個片段被放置在該堆棧上。當ViewPagers中的片段被放置在後臺堆棧上時,我想從內存中移除所有圖像,但是我無法想出辦法。Android ViewPager - 如何強制刪除所有項目?
我試着從適配器使用的列表中刪除所有的支持數據,然後調用.notifyDataSetChanged(),但是這並沒有通過併爲每個頁面調用PagerAdapter.destroyItem(),就像我希望的那樣。
我也試過使用FragmentStatePagerAdapter,但這也似乎沒有清除應用程序使用過程中的任何內存。
如何強制PagerAdapter在尋呼機中的所有項目上調用destroyItem()?
這裏是我的視圖代碼包含ViewPager:
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()!!
}
}
}
你可以嘗試在viewpager中使用簡單的視圖而不是片段嗎?我在我的一個項目和imageView.setImageDrawable(null)中有類似的問題;爲我工作。但片段不需要,所以我只用ViewGroup和ImageViews和TextViews。 – aelimill
嘗試使用FragmentStatePager適配器,並在getItemPosition方法上返回POSITION_NONE。 –