gpt4 book ai didi

android - 使用 FragmentPagerAdapter 的 Circular ViewPager

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:07 24 4
gpt4 key购买 nike

我想实现一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com