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时,屏幕会闪烁片刻,至少在我当前的测试设备上.
我会在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)