ViewPager没有提供根据position获取Fragment的方法,单纯的用FragmentStatePagerAdapter(或者FragmentPagerAdapter)里面自己创建的Fragment集合是无法获取ViewPager里面指定位置的Fragment对象的,被这个问题困扰了一阵子,经过一番研究了制造了一个解决办法,以下是我个人的一些理解,如有错误欢迎大牛指点:
ViewPager里面的Fragment像ListView的item一样是复用的,也就是说当有“足够”个Fragment在FragmentStatePagerAdapter(或者FragmentPagerAdapter)里面存在的时候,再次翻页将不会继续创建新的Fragment,想获取到指定position的Fragment对象,我自己实现了一个类似ListView.getChildAt(index)的方法,原理就是根据:在每次ViewPager需要一个用以显示Object的时候,FragmentStatePagerAdapter的instantiateItem()函数都会被调用,重写instantiateItem(),将里面每次显示过的Fragment对象记录下来:
class MyAdapter extends FragmentStatePagerAdapter {
private List<Fragment> mList;
private Map<Integer, Fragment> map = new HashMap<Integer, Fragment>();
public MyAdapter(FragmentManager fm, List<Fragment> list) {
super(fm);
mList = list;
}
@Override
public Fragment getItem(int position) {
return mList.get(position);
}
@Override
public int getCount() {
return mList == null ? 0 : mList.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
//记录每个position位置最后显示的Fragment
map.put(position, fragment);
return fragment;
}
@Override
public CharSequence getPageTitle(int position) {
return titleList.get(position).getTitle();
}
//获取指定位置最后显示的Fragment
public Fragment getCurrentFragment(int index) {
return map.get(index);
}
}
在Activity里面调用adapter.getCurrentFragment(index)就可以获取到指定位置的Fragment对象了,尽情的调用Fragment里面的函数来刷新数据吧~