Android 从FragmentPagerAdapter动态添加和删除片段

Android 从FragmentPagerAdapter动态添加和删除片段,android,android-viewpager,fragmentpageradapter,commonsware-cwac,Android,Android Viewpager,Fragmentpageradapter,Commonsware Cwac,我有一个用于viewPager的FragmentPagerAdapter,它最初只有一个片段。我想在用户从右向左滑动时向适配器动态添加新片段,并在用户从左向右滑动时动态删除片段。我曾尝试使用此库,但在该库中,我们可以在单击按钮时添加和删除片段。我曾尝试将OnPageChangeListener添加到viewpager,但回调方法(onPageScrolled和onPageScrollStateChanged)被多次调用,这导致FragmentPagerAdapter中添加了多个片段。因此,请阐明

我有一个用于viewPager的FragmentPagerAdapter,它最初只有一个片段。我想在用户从右向左滑动时向适配器动态添加新片段,并在用户从左向右滑动时动态删除片段。我曾尝试使用此库,但在该库中,我们可以在单击按钮时添加和删除片段。我曾尝试将OnPageChangeListener添加到viewpager,但回调方法(onPageScrolled和onPageScrollStateChanged)被多次调用,这导致FragmentPagerAdapter中添加了多个片段。因此,请阐明如何做到这一点

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

好的,任何
PagerAdadpter
都不支持该选项。
ArrayPagerAdapter
肯定不支持它。该页面必须存在,否则无法滑动到该页面。您不能先刷卡,然后再添加页面


此外,我从来没有发现过一个你提出的模式的用例,它不能通过将页面放在适配器中来处理,但在刷卡开始之前不能填充页面(即,无论你似乎试图避免的是什么昂贵的工作)。

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

有两种方法可以实现ViewPager: •碎片状态页雷达 •碎片页雷达

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

碎片PageRadapter:当碎片数量较少时。但是,使用AndroidFragmentPagerAdapter处理大量碎片会导致混乱和滞后

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


请按此链接获取代码:

我知道这篇文章很旧,但我很难弄明白,所以我还是会回答的

您想使用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();
        }
    }

:我正在尝试实现一个日历,因此每当用户从右向左滑动时,他都会转到下周。但在查看页面顶部还有一个按钮,允许用户切换月份。因此,想象一下这种情况,假设用户首先使用月份切换器buton转到下个月(在切换月份butonclick中,我写入viewpager.setCurrentItem)(currentposition+1)),然后决定滑动viewpager以转到前一周。用户将无法返回到开始的日期,因为在后台只有一个帧。我的需要:他应该返回到他开始的位置started@dora: “我正在尝试实现一个日历,因此每当用户从右向左滑动时,他都会转到下一周"--
ViewPager
不太适合这个角色,因为未来有无限多个星期,过去也有很多个星期。我不需要导航到过去。我只需要导航到当前时间和未来。如果有办法,请帮助我it@dora:同样,我不会使用
ViewPager
,而是would可以用手势滚动其他东西。哦,上帝..谢谢,伙计,在2天后找到了这个解决方案。工作很棒。非常感谢。通过扩展FragmentStatePagerAdapter而不是FragmentPageRadapter来实现添加现在很容易,删除的情况在哪里?确实如此,我已经继续了。我现在使用一个支持移动项目的工具。如果你调用
notifyDataSetChanged()
,它只会根据需要添加或删除片段。这意味着每个片段都必须自行管理更新,因为notify不会刷新片段。如果您使用Firebase或Room之类的工具,就可以了。
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;
        }
    }