Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewPager-如何强制删除所有项目?_Android_Android Fragments_Android Viewpager_Kotlin - Fatal编程技术网

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

Android ViewPager-如何强制删除所有项目?,android,android-fragments,android-viewpager,kotlin,Android,Android Fragments,Android Viewpager,Kotlin,我正在编写一个Android应用程序,它广泛使用包含高分辨率图像的ViewPager。我正在扩展PagerAdapter,并在适当的时候手动创建和销毁物品。直到这个碎片被放在后面,它才能正常工作。我想在带有ViewPagers的片段放在后台时从内存中删除所有图像,但我想不出一个方法 我尝试从适配器使用的列表中删除所有支持数据,然后调用.notifyDataSetChanged(),但这并没有像我希望的那样,为每个页面调用PagerAdapter.destroyItem() 我也尝试过使用Frag

我正在编写一个Android应用程序,它广泛使用包含高分辨率图像的ViewPager。我正在扩展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()!!
        }
    }
}
class ContentStrip:LinearLayout{
变量标题:WeakReference?=null
var titleString:String=“”
lateinit变量寻呼机:WeakReference
变量数据:ContentCollection?=null
//[…]其他视图方法
//从父片段的onDestroy调用
有趣的clearMemory(){
如果(数据==null)返回
变量i=-1
var contentItem:contentItem
用于(数据中的项!!.contentItems){
我++
var v:View?=pager.get().findViewWithTag(“${titleString}$i”):继续
contentItem=v作为contentItem
contentItem.image?.setImageDrawable(空)
contentItem.image=null
removeView(contentItem)
}
title=null
pager.get().removeAllViews()
数据?.contentItems?.clear()
pager.get().adapter.notifyDataSetChanged()
使无效
}
类ContentStripAdapter():PagerAdapter(){
lateinit变量外部:WeakReference
fun setOuterRef(cs:ContentStrip):ContentStripAdapter{
外部=弱引用(cs)
还这个
}
//[…]其他PagerAdapter方法
覆盖项目(容器:视图组,位置:Int,对象:Any){
var img:ContentItem?=对象作为ContentItem
img?.image?.setImageDrawable(空)
img?.image=null
img?.title=null
container.removeView(img)
img=null
}
重写fun getCount():Int{
返回outer.get().data?.contentItems?.count()!!
}
}
}

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

能否尝试在viewpager中使用简单视图而不是片段?我的一个项目和imageView.setImageDrawable(null)中也有类似的问题;为我工作。但是片段是不需要的,所以我只使用了一个带有ImageView和TextView的视图组。尝试使用FragmentStatePager适配器,在getItemPosition方法上只返回POSITION\u NONE。调用
PagerAdapter.POSITION\u NONE
如果其他视图不需要重新实例化,这不是一个好的解决方案。没有重新实例化PagerAdapter
还有其他解决方案吗?我们可以实现吗?您必须仅为要删除的项目返回
POSITION_NONE
。是的,我正在为要从视图寻呼机中删除的选定项目返回
POSITION_NONE
,但它再次重新实例化PagerAdapter,即寻呼机适配器重置。