【问题标题】:Dynamically Add and Remove Fragments From FragmentPagerAdapter从 FragmentPagerAdapter 动态添加和删除片段
【发布时间】:2013-12-03 01:17:49
【问题描述】:

我有一个 viewPager 的 FragmentPagerAdapter,它最初只有一个 Fragment。我想在用户从右向左滑动时向适配器动态添加一个新片段,并在用户从左向右滑动时动态删除一个片段。我尝试使用这个库https://github.com/commonsguy/cwac-pager,但在那个库中我们有一个选项在按钮单击时添加和删除片段。我试图向 viewpager 添加一个 OnPageChangeListener,但回调方法(onPageScrolled 和 onPageScrollStateChanged)被多次调用,这导致向 FragmentPagerAdapter 添加了多个片段。因此,请说明如何执行此操作。

【问题讨论】:

    标签: android android-viewpager fragmentpageradapter commonsware-cwac


    【解决方案1】:

    我知道这篇文章很旧,但我很难弄清楚,所以我还是会回答它。

    您想使用FragmentStatePagerAdapter 并覆盖getItemPosition()。创建一个您想要传递给片段的内容列表,调用notifyDataSetChanged(),一切就绪!

    这是适配器:

    public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
    
            List<String> mKeyList = new ArrayList<>();
    
            public SectionsPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public int getItemPosition(Object object) {
                return POSITION_NONE;
            }
    
            @Override
            public Fragment getItem(int position) {
                // getItem is called to instantiate the fragment for the given page.
                // Return a PlaceholderFragment (defined as a static inner class below).
                return PlaceholderFragment.newInstance(mKeyList.get(position));
            }
    
            @Override
            public int getCount() {
                return mKeyList.size();
            }
    
            @Override
            public CharSequence getPageTitle(int position) {
                return "SCOUT " + (getCount() - position);
            }
    
            public void add(int position, String key) {
                mKeyList.add(position, key);
                notifyDataSetChanged();
            }
        }
    

    这是片段:

    public static class PlaceholderFragment extends Fragment {
    
            private static final String ARG_SCOUT_KEY = "scout_key";
    
            public static PlaceholderFragment newInstance(String key) {
    
                PlaceholderFragment fragment = new PlaceholderFragment();
                Bundle args = new Bundle();
                args.putString(ARG_SCOUT_KEY, key);
                fragment.setArguments(args);
                return fragment;
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.current_scout_fragment, container, false);
    
                //getArguments().getString(ARG_SCOUT_KEY));
    
                return rootView;
            }
        }
    

    【讨论】:

    • 哦,天哪.. 谢谢伙计,两天后找到了这个解决方案。工作真棒。非常感谢。通过扩展 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter 实现
    • 现在添加很容易删除的情况在哪里?
    • 确实如此,我已经继续前进了。我现在使用支持移动项目的custom class。如果您调用notifyDataSetChanged(),它只会根据需要添加或删除片段。这确实意味着每个片段都必须自己管理更新,因为通知不会刷新片段。如果你使用像 Firebase 或 Room 这样的东西,你会没事的。
    【解决方案2】:

    @dora:我认为在你的情况下 FragmentStatePagerAdapter 会帮助你。根据我的理解,我在下面提到了它的用途。希望对您做出决定有所帮助。

    ViewPager有两种实现方式: • FragmentStatePagerAdapter • FragmentPagerAdapter

    FragmentStatePagerAdapter 类消耗更少的内存,因为它会在用户看不到片段时立即销毁片段,只保留该片段的已保存状态

    FragmentPagerAdapter:当片段数量较少时。但是对大量片段使用 AndroidFragmentPagerAdapter 会导致用户体验不稳定和滞后。

    viewPager 保留的页面数? 任何 ViewPager 将保留的项目数由 setOffscreenPageLimit() 方法设置。屏幕外页面限制的默认值为 3。这意味着 ViewPager 将跟踪当前可见的页面,向左一页,向右一页。跟踪页面的数量始终以当前可见页面为中心。

    请点击此链接获取代码:http://www.truiton.com/2013/05/android-fragmentpageradapter-example/

    【讨论】:

      【解决方案3】:

      我想在用户从右向左滑动时动态添加一个新的 Fragment 到适配器,并在用户从左向右滑动时动态删除一个 Fragment。

      AFAIK,任何PagerAdadpter 都不支持。 ArrayPagerAdapter 肯定不会支持它。该页面需要存在,否则您无法滑动到它。您不能先滑动,然后再添加页面。

      此外,我从未发现您提出的模式的用例无法通过将 page 放在适配器中而不是 填充 页面来处理(即,无论您似乎试图避免的昂贵工作是什么),直到滑动开始。

      【讨论】:

      • :我正在尝试实现一个日历,所以每当用户从右向左滑动时,他就会进入下周。但是视图寻呼机顶部还有一个按钮,可以让用户切换月份.so想象这种情况,假设用户首先使用月份切换按钮转到下个月(在切换月份按钮点击我写viewpager.setCurrentItem(curentposition + 1))然后决定刷viewpager去上一周。用户将无法返回到他开始的日期,因为后台只有一个框架。我的需要:他应该回到他开始的地方
      • @dora:“我正在尝试实现一个日历,因此每当用户从右向左滑动时,他就会进入下周”——ViewPager 不适合该角色,因为未来有无限多的周,过去有整整很多周。
      • 我不需要导航到过去。我需要能够导航的是当前时间和未来。所以如果有办法请帮助我
      • @dora:再说一次,我不会使用ViewPager,但会使用手势滚动其他东西。
      猜你喜欢
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多