In the FragmentStatePagerAdapter use a HashMap to store created fragments, then you can access them later from the viewpager container (activity or fragment):
public class CustomFragmentPagerAdapter extends FragmentStatePagerAdapter { private HashMap<Integer, CustomFragment> fragMap = new HashMap<Integer, CustomFragment>(); ... @Override public Fragment getItem(int position) { CustomFragment frag = new CustomFragment(); ... fragMap.put(position, frag); return frag; } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); fragMap.remove(position); } public CustomFragment getFragment(int position) { return fragMap.get(position); } ... }
Now in your viewpager container (activity or fragment):
private int lastPage = 0; ... viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { CustomFragment fragment; int currentPage = viewPager.getCurrentItem(); if(currentPage > lastPage) { fragment = yourPagerAdapter.getFragment(currentPage - 1); fragment.disconnect(); fragment = yourPagerAdapter.getFragment(currentPage); fragment.connect(); } else { fragment = yourPagerAdapter.getFragment(currentPage + 1); fragment.disconnect(); fragment = yourPagerAdapter.getFragment(currentPage); fragment.connect(); } lastPage = currentPage; } });
Since onPageChangeListener is not called when the application is running, you will need to connect the first fragment. The important thing is that you will have a link to the fragments returned by getItem() using yourPagerAdapter.getFragment(currentPage) .
Edit:
I think this may be the best logic for the onPageSelected() callback method:
viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { CustomFragment fragment; int currentPage = viewPager.getCurrentItem(); Set<Integer> myKeySet = yourPagerAdapter.getKeys(); for(Integer key : myKeySet) { if(key == currentPage) { fragment = yourPagerAdapter.getFragment(key); fragment.connect(); } else { fragment = yourPagerAdapter.getFragment(key); fragment.disconnect(); } } } });
But you need to implement this method on the FragmentStatePagerAdapter :
public Set<Integer> getKeys() { return fragMap.keySet(); }
and get rid of the lastPage data lastPage .
source share