【问题标题】:Android ViewPager - How to force removal of all items?Android ViewPager - 如何强制删除所有项目?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 调用PagerAdapter.POSITION_NONE 这不是一个好的解决方案,如果其他视图不需要重新实例化。没有re-instantiate PagerAdapter,还有其他解决方案可以实现吗?
  • 你必须返回POSITION_NONE 只为你想删除的项目。
  • 是的,我正在返回 POSITION_NONE 以从视图寻呼机中删除所选项目,但它再次重新实例化 PagerAdapter,即寻呼机适配器重置。
猜你喜欢
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多