FragmentPagerAdapter实现刷新
在fragmentpageadapter的instantiateItem方法里,他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新fragments集合是没有作用的。
所以要用新的方法实现刷新功能
主要思路
就是用新的fragment替换FragmentManager里缓存的旧的fragment,
在系统的代码中
String name = makeFragmentName(container.getId(), position);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
说明fragmentpageadapter内部是用tag识别fragment的,并且有它自己的一套算法用于生成tag,所以创建是它已经有了自己的tag,不用我们赋值。
所以我们这里必须用它生成的tag来添加新的fragment,否则fragmentpageadapter就无法识别这个新的fragment。
实例
更换fragment
List<Fragment> fragments = new ArrayList<>();
fragments.add(new PoliceFragment());
fragments.add(new GirlFragment());
fragments.add(new ThirdFragment());
boolean[] fragmentsUpdateFlag = { false, false, true};
TabsPagerAdapter adapter = new TabsPagerAdapter(getSupportFragmentManager(), fragments,fragmentsUpdateFlag);
mVP.setAdapter(adapter);
mVP.getAdapter().notifyDataSetChanged();
mTab.setupWithViewPager(mVP);
自定义Adapter的实现
package com.zj.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.view.ViewGroup;
import java.util.List;
/**
* Created by CoXier on 2016/5/2.
*/
public class TabsPagerAdapter extends FragmentPagerAdapter {
List<Fragment> mFragments;
FragmentManager fm;
private int curUpdatePager;
String[] titles = {"警察风采","在逃嫌犯","新闻资讯"};
boolean[] fragmentsUpdateFlag;
public TabsPagerAdapter(FragmentManager fm, List<Fragment> mFragments,boolean[] fragmentsUpdateFlag) {
super(fm);
this.fm=fm;
this.mFragments = mFragments;
this.fragmentsUpdateFlag=fragmentsUpdateFlag;
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//得到缓存的fragment
Fragment fragment = (Fragment) super.instantiateItem(container,
position);
//得到tag,这点很重要
String fragmentTag = fragment.getTag();
if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]) {
//如果这个fragment需要更新
FragmentTransaction ft = fm.beginTransaction();
//移除旧的fragment
ft.remove(fragment);
//换成新的fragment
fragment = mFragments.get(position % mFragments.size());
//添加新fragment时必须用前面获得的tag,这点很重要
ft.add(container.getId(), fragment, fragmentTag);
ft.attach(fragment);
ft.commit();
//复位更新标志
fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;
}
return fragment;
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
参考链接
FragmentPagerAdapter刷新fragment最完美解决方案 - z13759561330的专栏 - 博客频道 - CSDN.NET
FragmentPagerAdapter实现刷新的更多相关文章
- FragmentPagerAdapter刷新fragment最完美解决方案
FragmentPagerAdapter刷新fragment最完美解决方案 先感谢kingjxl2006的博客文章<Android FragmentPagerAdapter数据刷新notif ...
- 转载---ViewPager,PagerAdapter,FragmentPagerAdapter和FragmentStatePagerAdapter的分析对比
转载:http://blog.csdn.net/dreamzml/article/details/9951577 ViewPager ViewPager 如其名所述,是负责翻页的一个 View.准确说 ...
- ViewPager的刷新、限制预加载、缓存所有
[框架]: 公共部分:左侧菜单.TitleBar.RadioGroup(3个RadioButton:X.Y.Z) 选择X页面:指示器+ViewPager [要达成的效果]: (1)左侧选择A,进入X页 ...
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
在一个 Android 应用中,我使用 FragmentPagerAdapter 来 处理多 Fragment 页面的横向滑动.不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我 ...
- 【转】为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment? 转自:http://www.apkbus.com/android- ...
- android FragmentPagerAdapter getItem方法没有执行
转自 http://blog.csdn.net/getchance/article/details/40263505 在一个 Android 应用中,我使用 FragmentPagerAdapter ...
- FragmentPagerAdapter与FragmentStatePagerAdapter区别
在一个 Android 应用中,我使用 FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动.不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我希 ...
- 109、FragmentPagerAdapter与FragmentStatePagerAdapter区别
x 在一个 Android 应用中,我使用 FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动.不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时, ...
- ViewPager切换大量Fragment不刷新的问题
PagerAdapter,需要重写instantiateItem()加载视图,onDestroy()销毁视图FragmentPagerAdapter,每一个生成的Fargment都保存在内存中,也就是 ...
随机推荐
- oracle 彻底删除用户及表空间
1.删除表空间 可以先将其offline alter tablespace xxx offline; 将磁盘上的数据文件一同删除 drop tablespace xxx including conte ...
- gc是什么,什么时候需要gc
Java是由C++发展来的. 它摈弃了C++中一些繁琐容易出错的东西.其中有一条就是这个GC. 写C/C++程序,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值.内存再大也是有限的,所以 ...
- Java Io 对象序列化和反序列化
Java 支持将任何对象进行序列化操作,序列化后的对象文件便可通过流进行网络传输. 1. 对象序列化就是将对象转换成字节序列,反之叫对象的反序列化 2. 序列化流ObjectOut ...
- BZOJ1146——[CTSC2008]网络管理Network
1.题目大意:就是在动态的树上路径权值第k大. 2.分析:这个就是树链剖分+树套树 #include <cstdio> #include <cstdlib> #include ...
- [HDU3555]Bomb
[HDU3555]Bomb 试题描述 The counter-terrorists found a time bomb in the dust. But this time the terrorist ...
- C#高级编程笔记 Day 1, 2016年8月 30日 名词定义
1.C# 中的命名空间 namespace,我觉得和Java中的package 差不多,相当于一个"包" 一样. 2.修饰符 static 修饰方法表示方法不能在类的实例化上执行, ...
- BZOJ 4455: [Zjoi2016]小星星
Sol 容斥原理+树形DP. 这道题用的容斥思想非常妙啊!主要的思路就是让所有点与S集合中的点对应,可以重复对应,并且可以不用对应完全(意思是是S的子集也可以).这样他有未对应完全的,那就减去,从全都 ...
- 烂泥:php5.6源码安装及php-fpm配置
LNMP环境的搭建中,现在只有php没有源码安装过.这篇文章就把这个介绍下. 注意本篇文章使用的centos 6.5 64bit. 登陆centos下载php5.6的安装包.php的软件包可以去国内的 ...
- HTML知识点链接
1)<marquee> http://www.jb51.net/shouce/dhtml/objects/MARQUEE.html 2)"i ...
- PHP+Hadoop实现数据统计分析
记一次完全独立完成的统计分析系统的搭建过程,主要用到了PHP+Hadoop+Hive+Thrift+Mysql实现 安装 Hadoop安装: http://www.powerxing.com/inst ...