【问题标题】:Dynamically skip pages in ViewPager在 ViewPager 中动态跳过页面
【发布时间】:2013-11-20 14:29:37
【问题描述】:

我有一个ViewPager,它通过FragmentStatePagerAdapter 持有Fragments。假设寻呼机最初拥有以下页面 (Fragments):

A - B - C - D

当用户滑动时,他可以从A移动到BB@987654329 @ 等 但是有些情况下,当用户在A页面上更改了一些选项时,他可以不移动到B,而是C

A - C - D

然后用户返回 A,修改某些内容并重新启用 B

A - B - C - D

我怎样才能实现这种非常动态的行为?当用户更改某些内容然后重新填充ViewPager 时,我无法在任何时候添加Fragments,因为它很慢并且会中断流程。

【问题讨论】:

  • 类似于ListView,你可以简单地用不同的数据更新你ViewPager后面的FragmentStatePagerAdapter。在每种情况下,给Adapter 一组不同的Fragments
  • 但是如果我调用notifyDatasetChangedViewPager 会重新创建Fragments 的整个列表,并且跳转到第一页,每个Fragment 也会丢失状态。
  • 不要在 ViewPager 本身中创建片段,以免它们丢失状态。创建一次,例如在创建 FragmentActivity 时。之后,使用引用,不要创建新的。
  • 这不是一个坏主意。你有什么建议避免 ViewPager 在收到通知时跳转到第一页?
  • ViewPager.setCurrentItem(int position, boolean smoothscroll);

标签: android android-fragments android-viewpager android-adapter fragmentstatepageradapter


【解决方案1】:

我们也遇到过同样的情况,我们通过维护一个布尔型ArrayList解决了这个问题。这里的页面是片段。在 Fragment 上,我们编写了一个接口来更新 ArrayList。该接口在父活动上实现。在每次滑动 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
    }
});

【讨论】:

  • 虽然用户在滚动时仍然可以看到隐藏的片段,但我想这是我能找到的最好的了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多