如何制作ViewPager循环?

J3n*_*J3n 10 android loops android-fragments

我有一个ViewPager和一些视图.在最后一次右手划过后,我想去第一个.

我试过了

@Override
public Fragment getItem(int arg0) {
    int i = arg0 % fragmentList.size();
    return fragmentList.get(i);
}

@Override
public int getCount() {
    return fragmentList.size()+1;
}
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误

E/AndroidRuntime(22912): java.lang.IllegalStateException: Fragment already added: RubricFragment{4136cd80 #1 id=0x7f06000c android:switcher:2131099660:0}
Run Code Online (Sandbox Code Playgroud)

ben*_*nkc 28

一种可能性是设置这样的屏幕:

C'ABCA'

C'看起来就像C,但当你滚动到那里时,它会切换到真正的C. A'看起来就像A,但当你滚动到那里时,它会切换到真正的A.

我会通过像这样实现onPageScrollStateChanged来做到这一点:

@Override
public void onPageScrollStateChanged (int state) {
    if (state == ViewPager.SCROLL_STATE_IDLE) {
        int curr = viewPager.getCurrentItem();
        int lastReal = viewPager.getAdapter().getCount() - 2;
        if (curr == 0) {
            viewPager.setCurrentItem(lastReal, false);
        } else if (curr > lastReal) {
            viewPager.setCurrentItem(1, false);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这会调用setCurrentItem的替代形式并传递false以使跳转立即发生而不是平滑滚动.

我看到了两个主要的缺点.首先,在到达任何一端时,用户必须让滚动在他们可以走得更远之前解决.其次,它意味着在您的第一页和最后一页中拥有所有视图的第二个副本.根据屏幕资源的大小,可能会将此技术排除在可能的解决方案之外.

另请注意,由于视图寻呼机不会让点击进入底层控件直到滚动结束后,因此可能没有为A'和C'片段设置clicklisteners等.

编辑:现在我自己实现了这个,还有一个非常重要的缺点.当它从A'切换到A或C'到C时,屏幕会闪烁片刻,至少在我当前的测试设备上.


hom*_*3kh 6

我会在ViewPager的末尾创建一个虚拟页面.然后当用户滚动到虚拟页面时,我使用此代码转到第一页.我知道它远非完美:D

@Override
public void onPageScrolled(int position, float arg1, int arg2) {
    if (position >= NUM_PAGE-1) {
        mViewPager.setCurrentItem(0, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你这样做,是的,你可以实现无限滚动,但是在最后一页滚动时,你会看到像回到 scren1.. (2认同)