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怎么组合使用的,可以搜索其他文章来解决。

在Android中,ViewModel和Fragment的结合通常用于管理Activity或Fragment之间的数据状态,尤其是当涉及到复杂的数据流或需要缓存数据以便于性能优化的情况。如果你在嵌套Fragment时,Activity并未看到ViewModel更新后的数据,可能有以下几个原因: 1. **绑定错误**:确保你在Fragment中正确地绑定了ViewModel,通常是通过`setViewModel()`函数设置,并监听`LiveData`的变化。 ```java val viewModel = ViewModelProvider(this).get(MyViewModel::class.java) binding.lifecycleOwner = viewModel // 对于Jetpack Compose viewModel.data.observe(viewLifecycleOwner) { updatedData -> // 更新UI操作 } ``` 2. **生命周期管理**:如果Fragment不是由ViewModel启动的,那么它可能不会自动观察ViewModel的状态变化。你需要手动触发观察或者在适当的地方调用`notifyDataSetChanged()`等方法来更新界面。 3. **数据传递延迟**:如果数据更新发生在ViewModel的后台线程,而UI更新是在主线程,可能会导致短暂的不一致。你可以考虑在ViewModel中使用`runOnMain()`, `postValue()`等方法来同步更新UI。 4. **观察者取消**:在Fragment销毁时,确保取消对ViewModel的观察,避免内存泄漏。 5. **ViewModel的作用范围**:若在跨Fragment共享ViewModel时,记得选择正确的ViewModel类型(如SingleLiveEvent,HierarchicalViewModel),并确认ViewModel是否被正确地保存和恢复。 如果以上都没问题,检查一下日志或者使用如` Timber `或` Android Monitor `之类的工具,找出数据更新的具体位置,看看是否有异常或者预期的行为未发生。同时,别忘了检查`Related Question`部分的问题以深入了解可能的原因。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

King·Forward

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值