2016-01-21 67 views
1

我正在編寫一個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()!! 
     } 
    } 
} 
+0

你可以嘗試在viewpager中使用簡單的視圖而不是片段嗎?我在我的一個項目和imageView.setImageDrawable(null)中有類似的問題;爲我工作。但片段不需要,所以我只用ViewGroup和ImageViews和TextViews。 – aelimill

+1

嘗試使用FragmentStatePager適配器,並在getItemPosition方法上返回POSITION_NONE。 –

回答

2

PagerAdapter.destroyItem()不叫,因爲Psger.getItemPosition()回報PagerAdapter.POSITION_UNCHANGED默認實現。因此,當您致電PagerAdapter.notifyDataSetChanged()ViewPager繼續認爲您移除的物品仍然存在並且不會銷燬它們。您需要爲從適配器中移除的每個項目返回PagerAdapter.POSITION_NONE