Android ViewPager – Как принудительно удалить все предметы?

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

Я попытался удалить все данные резервного копирования из списка, который использует адаптер, а затем вызвать .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()!! } } } 

PagerAdapter.destroyItem() не вызывается, потому что реализация Psger.getItemPosition() по умолчанию возвращает PagerAdapter.POSITION_UNCHANGED . Поэтому, когда вы вызываете PagerAdapter.notifyDataSetChanged() ViewPager продолжает думать, что удаленные вами объекты все еще существуют и не уничтожают их. Вам нужно вернуть PagerAdapter.POSITION_NONE для каждого элемента, удаленного из адаптера.

Intereting Posts
Неподвижная последовательность, функциональная / потоковая идиома Kotlin Сохранять ViewModels с объемом фрагмента во вращающемся экране RecyclerView анимация элемента, onAnimationFinished, но не onAnimationStarted. Зачем? Как отфильтровать список на месте с Kotlin? Невозможно объединить dex в 1.0.60 в android 3.0 при использовании facebook-login.aar Именование условия if-value для использования в if block NotificationListenerСервис не создан Программировать триггерную кнопку HTML в Java Тестирование с помощью spek и обмен некоторыми базовыми тестовыми примерами для базовых классов Доступ с использованием классов Apollo из подпакета – Kotlin Котлин эквивалентен Groovy spead-dot (*.) Возврат компилятора Kotlin: неразрешенная ссылка: springframework весной 5.0 Факториал с использованием цикла `for` в Котлине Функция интерфейса сталкивается с функцией getter Как получить доступ к членам класса с таким же именем в функции расширения в Kotlin android