Я пишу приложение для 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()!!
}
}
}
Можете ли вы попробовать использовать простые представления вместо фрагментов в viewpager? У меня была аналогичная проблема в одном из моих проектов и imageView.setImageDrawable (null); работал на меня. Но фрагменты не нужны, поэтому я просто использовал ViewGroup с ImageViews и TextViews. – aelimill
попробуйте использовать адаптер FragmentStatePager, а по методу getItemPosition просто верните POSITION_NONE. –