參考文章: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怎麼組合使用的,可以搜索其他文章來解決。