Reputation: 2564
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
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