In your FragmentStatePagerAdapter
use a HashMap
to hold the created Fragments, then you can
access them later from your 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();
/* connect the current fragment and disconnect the previous one, in case
you actually need to disconnect it from the server,
otherwise just connect the current fragment.*/
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 the onPageChangeListener is not called when the app is started, you will need to connect the first fragment. The important thing is that you will have a reference to the fragments returned by getItem()
using yourPagerAdapter.getFragment(currentPage)
.
Edit:
I think this may be a better logic for 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 methd on FragmentStatePagerAdapter
:
public Set<Integer> getKeys() {
return fragMap.keySet();
}
and get rid of lastPage
data member.