Sartheris Stormhammer
Sartheris Stormhammer

Reputation: 2564

Android endless FragmentPagerAdapter using new adapter on swipe

I am trying to create an endless FragmentPagerAdapter , on swipe to replace the adapter with a new one, and depending on which side you swipe, a global variable to increase or decrease, so you can know on what position you are. So I have tried this

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setOffscreenPageLimit(0);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setCurrentItem(1);
    mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            if (mViewPager.getCurrentItem() == 0) {
                // left
                mViewPager.setAdapter(null);
                mViewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));
                mViewPager.setCurrentItem(1);
                MyVar.INST.position--;
            } else if (mViewPager.getCurrentItem() == 2) {
                // right
                mViewPager.setAdapter(null);
                mViewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));
                mViewPager.setCurrentItem(1);
                MyVar.INST.position++;
            }
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

the problem is, even though I have set the offscreenPageLimit to 0, Android still caches the 3 fragment in the memory by default, so when I scroll to the right, the method inside OnPageChangeListener is not being called, therefore the global variable is not being incremented properly.... Any idea how can I fix that?

EDIT: Here is the adapter

private class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return Fragment1.newInstance(MyVar.INST.position + position);
    }

    @Override
    public int getCount() {
        return 3;
    }

}

Upvotes: 1

Views: 695

Answers (1)

Sartheris Stormhammer
Sartheris Stormhammer

Reputation: 2564

So I managed to do it like this, works good

private void setAdapter() {
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setCurrentItem(1);
    mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            if (mViewPager.getCurrentItem() == 0) {
                // left
                mViewPager.removeAllViews();
                //globalVariable--;
                setAdapter();
            } else if (mViewPager.getCurrentItem() == 2) {
                // right
                mViewPager.removeAllViews();
                //globalVariable++;
                setAdapter();
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

And the adapter stays the same

private class SectionsPagerAdapter extends FragmentPagerAdapter {

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    return Fragment1.newInstance(MyVar.INST.position + position);
}

@Override
public int getCount() {
    return 3;
}

The main thing that makes it work is the mViewPager.removeAllViews(); which removes the previous fragments, so it doesnt mess up. Use the globalVariable defined in some other class, singleton for example, to know on which position you are from the start

Upvotes: 1

Related Questions