我正在编写一个Android应用程序,该应用程序大量使用包含高分辨率图像的ViewPagers。我正在扩展PagerAdapter并在适当时手动创建和销毁项目。在将这个片段放到该堆栈上之前,它可以正常工作。当我将带有ViewPagers的片段放到后台时,我想从内存中删除所有图像,但是我找不到办法。

我尝试从适配器使用的列表中删除所有支持数据,然后调用.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()!!
        }
    }
}

最佳答案

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

关于android - Android ViewPager-如何强制删除所有项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34934126/

10-10 06:06