Dynamically skip pages in ViewPager
Asked Answered
Q

1

13

I got a ViewPager which holds Fragments via FragmentStatePagerAdapter. Let's say the pager initially holds the following pages (Fragments):

A - B - C - D

When the user swipes, he can move from A to B, B to C etc. But there are cases when the user changes some options on the A page, he can move not to B, but C:

A - C - D

Then the user goes back to A, modifies something and that re-enables B:

A - B - C - D

How can i achieve this very dynamic behavior? I cannot add Fragments any time when the user changes something and then re-populate the ViewPager, because it's slow and breaks the flow.

Quadri answered 8/11, 2013 at 14:29 Comment(6)
Similar to a ListView, you can simply update the FragmentStatePagerAdapter behind your ViewPager with different data. Give the Adapter a different set of Fragments in each case.Sphacelus
But if i call notifyDatasetChanged, the ViewPager recreates the whole list of Fragments, and the jumps to the first page, also every Fragment loses the state.Quadri
Don't create your fragments in the ViewPager itself so they don't lose their state. Create them once, for example when the FragmentActivity is created. Afterwards, use the reference and don't create new ones.Sphacelus
That's not a bad idea. And what are you suggesting to avoid the ViewPager to jump to the first page when notified?Quadri
ViewPager.setCurrentItem(int position, boolean smoothscroll);Sphacelus
I try it, but it will flicker a bit, or not? I mean a first page flashes and that the current.Quadri
F
3

We too had the same situation, and we solved this issue by maintaining a boolean ArrayList.The pages here are fragments. On the Fragment, we had written an interface to update the ArrayList.This interface is implemented on the parent activity.On every swipe of the ViewPager we are retrieving the boolean ArrayList. On ViewPager, in setOnPageChangeListener we overrided the onPageSelected.

And here is the piece of code:

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
    }
});
Fungible answered 5/3, 2015 at 6:44 Comment(1)
Although user can still see the hidden fragment while scrolling, I guess this is the best I can find.Hebdomadal

© 2022 - 2024 — McMap. All rights reserved.