2016-01-21 4 views
1

Я пишу приложение для Android, которое широко использует ViewPagers, которые содержат изображения с высоким разрешением. Я расширяю PagerAdapter и вручную создаю и уничтожаю элементы, когда это необходимо. Он отлично работает, пока этот фрагмент не будет помещен в эту заднюю часть. Я хотел бы удалить все изображения из памяти, когда фрагмент с ViewPagers будет помещен в стопку, но я не могу понять способ.Android ViewPager - Как принудительно удалить все предметы?

Я попытался удалить все данные поддержки из списка, который использует адаптер, а затем вызвать .notifyDataSetChanged(), но это не проходит и вызывает PagerAdapter.destroyItem() для каждой страницы, как я надеюсь.

Я также пробовал использовать FragmentStatePagerAdapter, но это также, похоже, не удаляло какую-либо память во время использования приложения.

Как заставить PagerAdapter вызвать destroyItem() для всех элементов в пейджере?

Вот мой код View, который содержит 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 за каждый элемент, удаленный из адаптера.

Смежные вопросы