动态跳过ViewPager中的页面

13

我有一个使用FragmentStatePagerAdapter承载FragmentViewPager。假设初始时该ViewPager包含以下页面(Fragment):

A - B - C - D

用户向右划动时,可以从A移动到BB移动到C等。 但是,在某些情况下,如果用户在A页面更改了一些选项,则他可能不会移动到B,而是移动到C

A - C - D

然后用户返回A,修改了一些内容,这样就重新启用了B

A - B - C - D

我该如何实现这种非常动态的行为?我不能在用户更改某些内容并重新填充ViewPager时随时添加Fragment,因为这会很慢并且会破坏流程。


1
类似于“ListView”,您可以简单地更新“ViewPager”后面的“FragmentStatePagerAdapter”以使用不同的数据。在每种情况下为“Adapter”提供不同的“Fragments”集合。 - DroidBender
但是如果我调用notifyDatasetChangedViewPager会重新创建整个Fragment列表,并跳转到第一页,此外每个Fragment都会失去状态。 - WonderCsabo
1
不要在ViewPager本身中创建片段,以便它们不会失去状态。例如,在创建FragmentActivity时创建它们一次。之后,使用引用而不是创建新的。 - DroidBender
这不是个坏主意。你建议采取什么措施来避免ViewPager在通知时跳转到第一页? - WonderCsabo
ViewPager.setCurrentItem(int position, boolean smoothscroll); - DroidBender
我试一下,但会不会闪烁一下呢?我的意思是第一页闪烁一下然后才显示当前页。 - WonderCsabo
1个回答

3
我们也遇到了同样的情况,我们通过维护一个布尔型ArrayList来解决这个问题。 这里的页面是碎片。 在Fragment上,我们编写了一个接口来更新ArrayList。该接口在父Activity上实现。在ViewPager的每次滑动中,我们都会检索布尔型ArrayList。 在ViewPager的setOnPageChangeListener中,我们重写了onPageSelected。
以下是代码片段:
pageIndicator.setOnPageChangeListener(new OnPageChangeListener() {

    @Override
    public void onPageSelected(int position) {
        // TODO Auto-generated method stub

        pagesPageBreakInfoList = activityContext.getBooleanList();
        currentPageNumber = position;

        if (!pagesPageBreakInfoList.get(position)) {
            if (currentPageNumber > previouspagenumber) {
                previouspagenumber = currentPageNumber;
                if (numberofSubmodule == (position + 1)) {
                    viewPager.setCurrentItem(position - 1);
                } else {
                    viewPager.setCurrentItem(position + 1);
                }
            } else {
                previouspagenumber = currentPageNumber;
                viewPager.setCurrentItem(position - 1);
            }
        } else {
            previouspagenumber = currentPageNumber;
        }
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub
    }
});

虽然用户在滚动时仍然可以看到隐藏的片段,但我想这是我能找到的最好的解决方案。 - Sira Lam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接