FragementStatePagerAdapter

FragementStatePagerAdapter

1.FragmentPagerAdapter和FragementStatePagerAdapter的区别
    分别给ViewPager设置FragmentPagerAdapter和FragmentStatePagerAdapter,将ViewPager左右滑动一圈,通过查看日志,来理解这两种Adapter的区别。

FragmentPagerAdapter:
———-初始化 首页———-
———-初始化 应用———-
———-初始化 游戏———-
———-初始化 专题———-
———-初始化 推荐———-
———-初始化 分类———-
———-初始化 排行———-

FragmentStatePagerAdapter:
———-初始化 首页———-
———-初始化 应用———-
———-初始化 游戏———-
———-初始化 专题———-
———-初始化 推荐———-
———-初始化 分类———-
———-初始化 排行———-
———-初始化 推荐———-
———-初始化 专题———-
———-初始化 游戏———-
———-初始化 应用———-
———-初始化 首页———-

从日志可以看出:FragmentStatePagerAdapter每次都重新创建Fragment,而FragmentPagerAdapter则是将Fragment缓存起来了。

FragmentPagerAdapter和FragementStatePagerAdapter的区别:
    FragmentPagerAdapter:该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter

    FragmentStatePagerAdapter:该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存

2.FramgentPagerAdapter使用notifyDataSetChanged无效问题演示分析
在开发中,我们可能会遇到这样一个BUG:
     ViewPager使用FramgentPagerAdapter之后,notifyDataSetChanged无效。
原因分析:

FramgentPagerAdapter会缓存Framgent到FragementManager中。
当进行notifyDataSetChanged来更新UI时,FramgentPagerAdapter会优先从FragementManager中查找是否有缓存的Fragment,如果有缓存,则直接使用,不会再调用Adapter的getItem()方法去获取一个新的Fragment实例,我们期望notifyDataSetChanged后的更新UI的需求也就无法实现。

解决方案:
在notifyDataSetChanged之前,先从FragmentManager中将原先被缓存的Fragment清除。

public void notifyData() {
    // 移除fragmentManager中之前返回过的Framgent
    FragmentManager supportFragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = supportFragmentManager.beginTransaction();
    for (Fragment fragment : mFragments) {
        transaction.remove(fragment);
    }
    transaction.commit();
    transaction = null;

    // 清空数据集
    mFragments.clear();
    // 添加新的数据集
    mFragments.add(new HeimaFragmentButton());
    for (int i = 0; i < 9; i++) {
        // mFragments.add(new HeimaFragmentTextView(i + ""));
        mFragments.add(new HeimaFragmentTextView("我修改了内容" + i));
    }
    // 更新UI
    mAdapter.notifyDataSetChanged();
    Toast.makeText(getApplicationContext(), "notifyData", 0).show();
}

除了清除FragmentManager中的

Fragment缓存这种方案外,我们还可以直接改用FragmentStatePagerAdapter来解决这个Bug。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值