从FragmentPagerAdapter动态添加和删除片段

时间:2013-11-19 13:05:45

标签: android android-viewpager fragmentpageradapter commonsware-cwac

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

3 个答案:

答案 0 :(得分:9)

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

实施ViewPager有两种方法: •FragmentStatePagerAdapter •FragmentPagerAdapter

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

当片段数量较少时,

FragmentPagerAdapter:。但是,对于大量碎片使用AndroidFragmentPagerAdapter会导致不稳定且滞后的用户体验。

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

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

答案 1 :(得分:5)

我知道这篇文章很老了,但是我很难想出来,所以无论如何我都会回答它。

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

答案 2 :(得分:2)

  

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

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

此外,我从未找到过您的建议模式的用例,无法通过将放在适配器中来处理,而不是填充页面(即,无论你看起来试图避免哪些昂贵的工作,直到刷卡开始。