参考文章:https://www.jianshu.com/p/7d0ac2c9543f
参照这篇文章,在我实际项目开发过程中,帮助了我,感谢作者。特此记录。
涉及两个类:一个是Fragment,另一个是ViewPager适配器;
一,Fragment类
1、Fragment的实例化
主要是统一Fragment的实例化工作。如果Fragment需要外部传递参数,在此函数中要构造相关参数。
//传输数据
public static DrawerFragment newInstance(int dataFlag){
DrawerFragment drawerFragment = new DrawerFragment();
Bundle bundle = new Bundle();
bundle.putInt(DrawerFragment.DATAFLAG,dataFlag);
drawerFragment.setArguments(bundle);
return drawerFragment;
}
2、Fragment参数的获取
一定要在onCreate方法获取参数。有很多同学可能在onCreateView中获取参数,而此方法在某些状态下并不会被调用,导致数据丢失。
@Override
public void onAttach(Context context) {
super.onAttach(context);
Bundle bundle = getArguments();
if(null != bundle){
dataFlag = bundle.getInt(DATAFLAG);
}
}
3、Fragment参数的更新
更新Fragment内部成员变量的同时也要更新args参数中的值。此步骤要和ViewPager适配器配合使用,实现Fragment动态刷新。
//更新数据
public void updateArguments(int dataFlag){
this.dataFlag = dataFlag;
Bundle bundle = getArguments();
if(null != bundle){
bundle.putInt(DATAFLAG,dataFlag);
}
}
二,下面描述ViewPager适配器写法,以FragmentPagerAdapter适配器为例子。
1、getItem
此方法必须实现,返回具体Fragment,并且初始化Fragment需要的参数。
@Override
public Fragment getItem(int position) {
return DrawerFragment.newInstance(fragmentList.get(position).getArguments().getInt(DrawerFragment.DATAFLAG));
}
2、instantiateItem
如果你要动态刷新数据,必须实现此方法,并且仅能在此方法里,不能是getItem。否则调用notifyDataSetChanged无效。
@Override
public Object instantiateItem(ViewGroup container, int position) {
DrawerFragment fragment = (DrawerFragment) super.instantiateItem(container, position);
fragment.updateArguments(fragmentList.get(position).getArguments().getInt(DrawerFragment.DATAFLAG));
return fragment;
}
3、getItemPosition
返回PagerAdapter.POSITION_NONE保证调用notifyDataSetChanged刷新Fragment。
@Override
public int getItemPosition(@android.support.annotation.NonNull Object object) {
return PagerAdapter.POSITION_NONE;
}
按照上面的步骤对应实现即可,改装成自己需要的。
这里并没有说Viewpager+Fragment怎么组合使用的,可以搜索其他文章来解决。