android - 使用 FragmentPagerAdapter 的 Circular ViewPager

标签 android android-fragments android-viewpager

我想实现一个 ViewPager,它使用 Fragments 并且可以在曲线运动中滑动,例如页面(A<-->B<-->C<-->A)。 我已经阅读了几篇关于如何完成此操作的文章,例如返回有多少元素的假计数,并将位置设置在中间的开始位置。 how to create circular viewpager?

这些似乎都基于 PagerAdapter。当我在扩展 FragmentPagerAdapter 时尝试做类似的事情时,只要我返回一个 fakeCount 的页面,当我滑动浏览我的 fragment 时,我就会得到一个异常,我只有 2 个 fragment 。 异常:java.lang.IllegalStateException:无法更改 fragment 的标签。

我认为这是因为 FragmentManager 认为我在位置 2 但位置 2 指向位置 0 的 fragment 。有谁知道我如何避免这种情况?我在想我应该尝试扩展 Fragmentmanager。非常感谢任何示例或帮助。

最佳答案

我知道有点晚了,但这对我来说是这样的:

我需要在 3 个 fragment 之间进行循环滑动,所以我将这 3 个和另外两个虚拟化以帮助我实现页面循环:

public static class FirstViewFragment extends Fragment {
    // Empty Constructor
    public FirstViewFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_landing_1, container, false);
    }
}

public static class SecondViewFragment extends Fragment {
    // Empty Constructor
    public SecondViewFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_landing_2, container, false);
    }
}

public static class ThirdViewFragment extends Fragment {
    // Empty Constructor
    public ThirdViewFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_landing_3, container, false);
    }
}

还有两个虚拟 fragment 使我能够从第一个向左滑动,从最后一个向右滑动。第一个虚拟膨胀与最后一个实际相同的布局,最后一个虚拟与第一个实际相同的布局:

public static class StartVirtualFragment extends Fragment {
    public StartVirtualFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_landing_3, container, false);
    }
}

public static class EndVirtualFragment extends Fragment {
    public EndVirtualFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_landing_1, container, false);
    }
}

我的适配器:

private class ViewPagerAdapter extends FragmentPagerAdapter {

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        switch (i) {
            case 0:
                return new StartVirtualFragment();
            case 1:
                if (firstViewFragment == null) {
                    firstViewFragment = new FirstViewFragment();
                }
                return firstViewFragment;
            case 2:
                if (secondViewFragment == null) {
                    secondViewFragment = new SecondViewFragment();
                }
                return secondViewFragment;
            case 3:
                if (thirdViewFragment == null) {
                    thirdViewFragment = new ThirdViewFragment();
                }
                return thirdViewFragment;
            case 4:
                return new EndVirtualFragment();
        }
        return null;
    }

    @Override
    public int getCount() {
        return 5;
    }
}

我的页面监听器使用 onPageScrollStateChanged 来设置正确的页面并实现循环:

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == ViewPager.SCROLL_STATE_DRAGGING) {
                int pageCount = viewPager.getChildCount();
                int currentItem = viewPager.getCurrentItem();
                if (currentItem == 0) {
                    viewPager.setCurrentItem(pageCount - 2, false);
                } else if (currentItem == pageCount - 1) {
                    viewPager.setCurrentItem(1, false);
                }
            }
        }
    });

最后:

viewPager.setCurrentItem(1);

希望对你有帮助

关于android - 使用 FragmentPagerAdapter 的 Circular ViewPager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141346/

相关文章:

安卓zxing : How to get product name when a UPC_A code is scanned

android - 我在 R.java 中有错误?

android - getChildFragmentManager() 如何支持所有 API 级别

android - ViewPager 中的 fragment 返回空对象 onResume

android - View Pager + ImageView +Pinch Zoom + Rotation

android - PageAdapter.Instantiate 新项目的时机

java - 找不到类文件

android - 我将文件写入 Environment.DIRECTORY_DOWNLOADS,为什么我无法通过下载应用程序看到它?

java - 安装 Android Studio 进行 Android 开发

java - 如何使用 viewPager 和 Fragments 传递多个数据