ViewPager+Fragment數據傳遞和動態刷新Fragment數據

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章