android - 如何制作 ViewPager 循环?

标签 android loops android-fragments

我有一个带有一些 View 的 ViewPager。我想在最后一个右滑后转到第一个。

我试过了

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

@Override
public int getCount() {
    return fragmentList.size()+1;
}

但是我得到了一个错误

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

最佳答案

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

C' A B C A'

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);
        }
    }
}

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

我认为这有两个主要缺点。首先,到达任一端后,用户必须让滚动稳定下来才能继续。其次,这意味着在您的第一页和最后一页中拥有所有 View 的第二个副本。根据您的屏幕的资源密集程度,可能会排除此技术作为可能的解决方案。

另请注意,由于 View 分页器在滚动稳定之前不会让点击进入底层控件,因此不为 A' 和 C' fragment 设置点击监听器等可能没问题。

编辑:现在我自己实现了这个,还有另一个相当大的缺点。当它从 A' 切换到 A 或从 C' 切换到 C 时,屏幕会闪烁片刻,至少在我目前的测试设备上是这样。

关于android - 如何制作 ViewPager 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10188011/

相关文章:

android - 适用于 Android 的 Google Places 自动完成仅捕获街道

javascript - for循环只输出最后一次迭代

css - 如何让 CSS 动画每 10 秒播放一次

android - 在 fragment 中初始化字体

android - 如何在广播接收器中启动 fragment

android - 如何在运行时更新 Android BLE Advertiser 服务数据?

java - 访问被拒绝找到属性 "vendor.debug.egl.swapinterval"当我运行我的应用程序时,我在 android studio 中不断收到此错误

java - 如何让 videoView 在 fragment 内播放?

android - ContextCompat.getColor() 忽略 NightMode

c - 编写一个 “query-controlled” 循环,将继续从用户输入 int 值?