在fragmentpageadapter的instantiateItem方法里,他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新fragments集合是没有作用的。

所以要用新的方法实现刷新功能

主要思路

就是用新的fragment替换FragmentManager里缓存的旧的fragment,

在系统的代码中

  1. String name = makeFragmentName(container.getId(), position);
  2. Fragment fragment = mFragmentManager.findFragmentByTag(name);

说明fragmentpageadapter内部是用tag识别fragment的,并且有它自己的一套算法用于生成tag,所以创建是它已经有了自己的tag,不用我们赋值。

所以我们这里必须用它生成的tag来添加新的fragment,否则fragmentpageadapter就无法识别这个新的fragment。

实例

更换fragment

  1. List<Fragment> fragments = new ArrayList<>();
  2. fragments.add(new PoliceFragment());
  3. fragments.add(new GirlFragment());
  4. fragments.add(new ThirdFragment());
  5. boolean[] fragmentsUpdateFlag = { false, false, true};
  6. TabsPagerAdapter adapter = new TabsPagerAdapter(getSupportFragmentManager(), fragments,fragmentsUpdateFlag);
  7. mVP.setAdapter(adapter);
  8. mVP.getAdapter().notifyDataSetChanged();
  9. mTab.setupWithViewPager(mVP);

自定义Adapter的实现

  1. package com.zj.adapter;
  2. import android.support.v4.app.Fragment;
  3. import android.support.v4.app.FragmentManager;
  4. import android.support.v4.app.FragmentPagerAdapter;
  5. import android.support.v4.app.FragmentTransaction;
  6. import android.view.ViewGroup;
  7. import java.util.List;
  8. /**
  9. * Created by CoXier on 2016/5/2.
  10. */
  11. public class TabsPagerAdapter extends FragmentPagerAdapter {
  12. List<Fragment> mFragments;
  13. FragmentManager fm;
  14. private int curUpdatePager;
  15. String[] titles = {"警察风采","在逃嫌犯","新闻资讯"};
  16. boolean[] fragmentsUpdateFlag;
  17. public TabsPagerAdapter(FragmentManager fm, List<Fragment> mFragments,boolean[] fragmentsUpdateFlag) {
  18. super(fm);
  19. this.fm=fm;
  20. this.mFragments = mFragments;
  21. this.fragmentsUpdateFlag=fragmentsUpdateFlag;
  22. }
  23. @Override
  24. public Fragment getItem(int position) {
  25. return mFragments.get(position);
  26. }
  27. @Override
  28. public Object instantiateItem(ViewGroup container, int position) {
  29. //得到缓存的fragment
  30. Fragment fragment = (Fragment) super.instantiateItem(container,
  31. position);
  32. //得到tag,这点很重要
  33. String fragmentTag = fragment.getTag();
  34. if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]) {
  35. //如果这个fragment需要更新
  36. FragmentTransaction ft = fm.beginTransaction();
  37. //移除旧的fragment
  38. ft.remove(fragment);
  39. //换成新的fragment
  40. fragment = mFragments.get(position % mFragments.size());
  41. //添加新fragment时必须用前面获得的tag,这点很重要
  42. ft.add(container.getId(), fragment, fragmentTag);
  43. ft.attach(fragment);
  44. ft.commit();
  45. //复位更新标志
  46. fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;
  47. }
  48. return fragment;
  49. }
  50. @Override
  51. public int getCount() {
  52. return mFragments.size();
  53. }
  54. @Override
  55. public CharSequence getPageTitle(int position) {
  56. return titles[position];
  57. }
  58. }

参考链接

FragmentPagerAdapter刷新fragment最完美解决方案 - z13759561330的专栏 - 博客频道 - CSDN.NET

FragmentPagerAdapter实现刷新的更多相关文章

  1. FragmentPagerAdapter刷新fragment最完美解决方案

    FragmentPagerAdapter刷新fragment最完美解决方案   先感谢kingjxl2006的博客文章<Android FragmentPagerAdapter数据刷新notif ...

  2. 转载---ViewPager,PagerAdapter,FragmentPagerAdapter和FragmentStatePagerAdapter的分析对比

    转载:http://blog.csdn.net/dreamzml/article/details/9951577 ViewPager ViewPager 如其名所述,是负责翻页的一个 View.准确说 ...

  3. ViewPager的刷新、限制预加载、缓存所有

    [框架]: 公共部分:左侧菜单.TitleBar.RadioGroup(3个RadioButton:X.Y.Z) 选择X页面:指示器+ViewPager [要达成的效果]: (1)左侧选择A,进入X页 ...

  4. 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?

    在一个 Android 应用中,我使用 FragmentPagerAdapter 来 处理多 Fragment 页面的横向滑动.不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我 ...

  5. 【转】为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?

    为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment? 转自:http://www.apkbus.com/android- ...

  6. android FragmentPagerAdapter getItem方法没有执行

    转自 http://blog.csdn.net/getchance/article/details/40263505 在一个 Android 应用中,我使用 FragmentPagerAdapter  ...

  7. FragmentPagerAdapter与FragmentStatePagerAdapter区别

    在一个 Android 应用中,我使用 FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动.不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我希 ...

  8. 109、FragmentPagerAdapter与FragmentStatePagerAdapter区别

    x 在一个 Android 应用中,我使用 FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动.不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时, ...

  9. ViewPager切换大量Fragment不刷新的问题

    PagerAdapter,需要重写instantiateItem()加载视图,onDestroy()销毁视图FragmentPagerAdapter,每一个生成的Fargment都保存在内存中,也就是 ...

随机推荐

  1. MySQL 8.0.0 版本发布,亮点都在这了!

    导读 MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司.目前MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤其是开 ...

  2. 基于php的snmp管理端开发

    一.系统环境: 操作系统:CentOS 5.4                内核:Linux_2.6 编译环境:gcc 4.1.2                代码版本:php-5.2.8.tar ...

  3. c++对象创建带括号与无括号的区别

    class Test{public: Test() {} Test(int a) {}} 1.栈上创建对象 1.1 无括号 Test a; // 调用默认构造函数,栈上分配内存创建对象 1.2 有括号 ...

  4. SPOJ 375 Query on a tree

    Description 给出一个树,每条边有边权,支持两种操作,询问 \(u,v\) 路径上边权最大值,修改第 \(i\) 条边的边权,\(n\leqslant 10^4,T\leqslant 10\ ...

  5. 模式串匹配,kmp

    #include <stdio.h> #include <stdlib.h> #include <string> #include<string.h> ...

  6. python 正则表达式点号与'\n'符号的问题

    遇到了一个小虫,特记录之. 1.正则表达式及英文的处理如下: >>> import re >>> b='adfasdfasf<1safadsaf>23w ...

  7. phpcms访问顶级栏目,自动跳到第一个子栏目

    在顶级栏目的category页放入如下代码: <?php if($child){ $child_arrary=explode(',',$arrchildid); $to_url=$CATEGOR ...

  8. 使用WITH AS提高性能简化嵌套SQL

    一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让 ...

  9. Wijmo 5 与Breeze 的组合,及与METRONIC 的集成

    1.Wijmo 5  是支持ANGULARJS 的HTML5 控件   http://wijmo.gcpowertools.com.cn/ 官方试用版  C1Wijmo-Eval_5.20151.42 ...

  10. java Thread和Runnable区别

    ①Thread类实现了Runnable接口,主要构造方法为Thread(Runnable target).Thread(Runnable target,String name).Thread(Stri ...