重用 ViewPager 和 FragmentPagerAdapter 的片段

Posted

技术标签:

【中文标题】重用 ViewPager 和 FragmentPagerAdapter 的片段【英文标题】:Re-use fragments of ViewPager & FragmentPagerAdapter 【发布时间】:2019-12-18 09:39:33 【问题描述】:

如何重用视图分页器中的片段??? 我有查看寻呼机,里面有 3 个片段。 我一直在创建片段的新实例。所以它需要更多的内存空间。 在这 3 个片段中执行相同的功能。虽然我每次都创建新实例。它有更多的问题,比如。 1)键盘打开和关闭需要时间。 2) Scrollview 需要时间来滚动。 3) 编辑文本需要时间来关注和关闭。

https://prnt.sc/or86ec

这里我用 3 个片段实现了 viewpager。在滑动它看起来像一样。

我已经创建了寻呼机适配器:

public class ProposalDetailPagerAdapter : FragmentStatePagerAdapter, CardAdapter

    private static int NUM_ITEMS = 3;
    private float mBaseElevation;

    public ProposalDetailPagerAdapter(android.Support.V4.App.FragmentManager fm, float baseElevation) : base(fm)
    
        mBaseElevation = baseElevation;
    

    public override int Count => NUM_ITEMS;

    public override int GetItemPosition(Java.Lang.Object @object)
    

        if (@object is ProposalDetailFragment)
        
           ProposalDetailFragment fragment = (ProposalDetailFragment)@object;
           if (fragment != null)
           
               fragment.UpdateFragmentAfterCreate();
           
        

        return base.GetItemPosition(@object);
    

    public int getCount()
    
        return NUM_ITEMS;
    

    public override Android.Support.V4.App.Fragment GetItem(int position)
    
       switch (position)
        
           case 0:
               return OpenFragment(0);
           case 1:
               return OpenFragment(1);
           case 2:
               return OpenFragment(2);
          default:
               return null;
      
    


    private Android.Support.V4.App.Fragment OpenFragment(int position)
    

           ProposalDetailFragment createdFragment = new ProposalDetailFragment();

        Bundle bundle = new Bundle();
        bundle.PutInt("position", position);
        createdFragment.Arguments = bundle;
        return createdFragment;
    


    public override Android.Support.V4.App.Fragment GetItem(int position)
    

        switch (position)
        
            case 0:
                return OpenFragment(0);
            case 1:
                return OpenFragment(1);
            case 2:
                return OpenFragment(2);
            default:
                return null;
        

    


在这个适配器中,创建了 3 个片段。但它有很多内存问题。因为很多条件都包含在片段中。并创建了 3 个内存实例。那么如何解决这个问题???

【问题讨论】:

【参考方案1】:

这是一个解决方案:

ProposalDetailPagerAdapter中,可以重写DestroyItem方法,并注释掉调用父类的方法,避免重复创建fragment。

如下:

public class ProposalDetailPagerAdapter : FragmentStatePagerAdapter, CardAdapter

    ...

    public override void DestroyItem(ViewGroup container, int position, Java.Lang.Object @object)
    
        //base.DestroyItem(container, position, @object);
        // Comment out the calling parent class
    
    ...

【讨论】:

但是它创建了三个viewpager实例 @VanjaraSweta 是的,如果被添加,将执行else方法,这不会创建片段的新实例。不明白为什么创建三个viewpager实例。 它创建了 3 个片段实例,因为我必须一次显示 3 个视图。 @VanjaraSweta 如果想重复使用 fragment ,您只需要创建一个 fragment 实例。而且三个fragment不能同时显示。一个出现时,fragment会删除之前的子内容,然后添加新的子内容。那么只需要一个fragment就可以显示三个视图。 我们如何在另一个显示的同时删除以前的子内容??

以上是关于重用 ViewPager 和 FragmentPagerAdapter 的片段的主要内容,如果未能解决你的问题,请参考以下文章

怎么实现recyclerview的第0项为viewpager并实现自动播放功能

片段存储和重用:使用TabView的多个子片段

Android ------ ViewPager1和ViewPager2的使用

Android ------ ViewPager1和ViewPager2的使用

Android ------ ViewPager1和ViewPager2的使用

Android ------ ViewPager1和ViewPager2的使用