【发布时间】:2016-01-21 20:55:04
【问题描述】:
我正在编写一个广泛使用包含高分辨率图像的 ViewPagers 的 Android 应用程序。我正在扩展 PagerAdapter 并在适当的时候手动创建和销毁项目。它工作正常,直到这个片段被放置在那个 backstack 上。当带有 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()!!
}
}
}
【问题讨论】:
-
您可以尝试在 viewpager 中使用简单视图而不是片段吗?我在我的一个项目和 imageView.setImageDrawable(null); 中遇到了类似的问题;为我工作。但是不需要片段,所以我只使用了带有 ImageViews 和 TextViews 的 ViewGroup。
-
尝试使用 FragmentStatePager 适配器,在 getItemPosition 方法上只返回 POSITION_NONE。
标签: android android-fragments android-viewpager kotlin