重用 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并实现自动播放功能
Android ------ ViewPager1和ViewPager2的使用
Android ------ ViewPager1和ViewPager2的使用