ViewPager+Fragment数据传递和动态刷新Fragment数据

1、Fragment的实例化
主要是统一Fragment的实例化工作。如果Fragment需要外部传递参数,在此函数中要构造相关参数。

    //传输数据
    public static HotFragment newInstance(int osId) {
        HotFragment f = new HotFragment();
        Bundle b = new Bundle();
        b.putInt("osId", osId);
        f.setArguments(b);
        return f;
    }

2、Fragment参数的获取
一定要在onCreate方法获取参数。有很多同学可能在onCreateView中获取参数,而此方法在某些状态下并不会被调用,导致数据丢失。

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Bundle arguments = getArguments();
        if (arguments != null) {
            mOsId = arguments.getInt("osId", 0);
        }
    }

3、Fragment参数的更新
更新Fragment内部成员变量的同时也要更新args参数中的值。此步骤要和ViewPager适配器配合使用,实现Fragment动态刷新。

    //更新数据
    public void updateArguments(int pageType) {
        this.mOsId = pageType;
        Bundle args = getArguments();
        if (args != null) {
            args.putInt("osId", pageType);
        }
    }

下面描述ViewPager适配器写法,以FragmentPagerAdapter适配器为例子。
1、getItem
此方法必须实现,返回具体Fragment,并且初始化Fragment需要的参数。

    @Override
    public Fragment getItem(int position) {
        return HotFragment.newInstance(mTitle.get(position).getCode());
    }

2、instantiateItem
如果你要动态刷新数据,必须实现此方法,并且仅能在此方法里,不能是getItem。否则调用notifyDataSetChanged无效。

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        HotFragment fragment = (HotFragment) super.instantiateItem(container, position);
        fragment.updateArguments(mTitle.get(position).getCode());
        return fragment;
    }

3、getItemPosition
返回PagerAdapter.POSITION_NONE保证调用notifyDataSetChanged刷新Fragment。

@Override
    public int getItemPosition(Object object) {
        return PagerAdapter.POSITION_NONE;
    }
    原文作者:趙亞坤
    原文地址: https://www.jianshu.com/p/7d0ac2c9543f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞