Android ViewPager - 如何强制删除所有项目?

时间:2016-01-21 20:55:04

标签: android android-fragments android-viewpager kotlin

我正在编写一个Android应用程序,它广泛使用包含高分辨率图像的ViewPagers。我正在扩展PagerAdapter并在适当的时候手动创建和销毁项目。它工作正常,直到这个片段放在该backstack上。当ViewScriptrs的片段放在backstack上时,我想从内存中删除所有图像,但我无法找到方法。

我尝试从适配器使用的列表中删除所有后备数据,然后调用.notifyDataSetChanged(),但这不会通过,并且像我希望的那样为每个页面调用PagerAdapter.destroyItem()。

我也尝试使用FragmentStatePagerAdapter,但在应用程序使用期间,这似乎也没有清除任何内存。

如何强制PagerAdapter在寻呼机的所有项目上调用destroyItem()?

以下是包含ViewPager的View的代码:

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()!!
        }
    }
}

1 个答案:

答案 0 :(得分:2)

PagerAdapter.destroyItem()未被调用,因为Psger.getItemPosition()的默认实现返回PagerAdapter.POSITION_UNCHANGED。因此,当您致电PagerAdapter.notifyDataSetChanged()ViewPager继续认为您删除的项目仍然存在且不会销毁它们。您需要为从适配器中删除的每个项目返回PagerAdapter.POSITION_NONE