有关FragmentPagerAdapter适配器中的fragment数据刷新问题
2016-11-02 16:38
411 查看
有很多时候会需要用到选项卡式的布局,如果没有特殊情况一般不需要在viewpager所在activity中更改数据。但是如果需要更改刷新数据如何处理?比如我加个筛选项就需要实时的刷新fragment中的数据。
当数据发生改变调用fragmentpageadpater的notifyDataSetChanged方法时发现数据根本就没有刷新。网络上会提到pageadapter的刷新方案如下代码:
复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。
原来他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新的fragmentList集合是没有作用的,还要清除FragmentManager里面缓存的fragment。
所以如果不是viewpager中的元素个数增加或者减少调用notifyDataSetChanged方法是不好使的。就不会执行适配器中的getItem方法。那正确的方法就是把缓存的fragment给移除,重新设置fragment。
以下是我代码的事例:
初始化适配器并设置
CivilizationFragment21 civilizationFragment21 = CivilizationFragment21.newInstance(userType, weekId);
CivilizationFragment22 civilizationFragment22 = CivilizationFragment22.newInstance(userType, weekId);
CivilizationFragment23 civilizationFragment23 = CivilizationFragment23.newInstance(userType, weekId);
fragments.add(civilizationFragment21);
fragments.add(civilizationFragment22);
fragments.add(civilizationFragment23);
adapter = new CivilizationViewPagerAdapter(getSupportFragmentManager(), titles, fragments);
mViewPager.setAdapter(adapter);
当有数据发生变化时调用:
fragment21 = CivilizationFragment21.newInstance(userType, weeks.get(newPosition).getWeek());
fragment22 = CivilizationFragment22.newInstance(userType, weeks.get(newPosition).getWeek());
fragment23 = CivilizationFragment23.newInstance(userType, weeks.get(newPosition).getWeek());
List<Fragment> list = new ArrayList<Fragment>();
list.add(fragment21);
list.add(fragment22);
list.add(fragment23);
adapter.setFragments(list);
adapter.notifyDataSetChanged();
适配器:
public class CivilizationViewPagerAdapter extends FragmentPagerAdapter {
private static final java.lang.String TAG = "校园文明";
private String titles[];
private int userType;
private String weekNow;
private OnReloadListener mListener;
private List<Fragment> fgs = null;
FragmentManager fm;
public CivilizationViewPagerAdapter(FragmentManager supportFragmentManager, String[] titles, List<Fragment> fragments) {
super(supportFragmentManager);
this.fgs = fragments;
this.titles = titles;
this.fm = supportFragmentManager;
}
public void setFragments(List<Fragment> fragments) {
if(this.fgs != null){
FragmentTransaction ft = fm.beginTransaction();
for(Fragment f:this.fgs){
ft.remove(f);
}
ft.commit();
ft=null;
fm.executePendingTransactions();
}
this.fgs = fragments;
notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
return fgs.get(position);
}
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public int getCount() {
if (titles == null) return 0;
return titles.length;
}
}
当数据发生改变调用fragmentpageadpater的notifyDataSetChanged方法时发现数据根本就没有刷新。网络上会提到pageadapter的刷新方案如下代码:
复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。
@Override public int getItemPosition(Object object) { return POSITION_NONE; }结果你发现是刷新了一下但内容还是原始的数据。通过对fragmentpageadapter的源码查看你会在instantiateItem方法里面发现这一段
// Do we already have this fragment? String name = makeFragmentName(container.getId(), position); Fragment fragment = mFragmentManager.findFragmentByTag(name); if (fragment != null) { if (DEBUG) Log.v(TAG, "Attaching item #" + position + ": f=" + fragment); mCurTransaction.attach(fragment); } else { fragment = getItem(position); if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment); mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), position)); }
原来他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新的fragmentList集合是没有作用的,还要清除FragmentManager里面缓存的fragment。
所以如果不是viewpager中的元素个数增加或者减少调用notifyDataSetChanged方法是不好使的。就不会执行适配器中的getItem方法。那正确的方法就是把缓存的fragment给移除,重新设置fragment。
以下是我代码的事例:
初始化适配器并设置
CivilizationFragment21 civilizationFragment21 = CivilizationFragment21.newInstance(userType, weekId);
CivilizationFragment22 civilizationFragment22 = CivilizationFragment22.newInstance(userType, weekId);
CivilizationFragment23 civilizationFragment23 = CivilizationFragment23.newInstance(userType, weekId);
fragments.add(civilizationFragment21);
fragments.add(civilizationFragment22);
fragments.add(civilizationFragment23);
adapter = new CivilizationViewPagerAdapter(getSupportFragmentManager(), titles, fragments);
mViewPager.setAdapter(adapter);
当有数据发生变化时调用:
fragment21 = CivilizationFragment21.newInstance(userType, weeks.get(newPosition).getWeek());
fragment22 = CivilizationFragment22.newInstance(userType, weeks.get(newPosition).getWeek());
fragment23 = CivilizationFragment23.newInstance(userType, weeks.get(newPosition).getWeek());
List<Fragment> list = new ArrayList<Fragment>();
list.add(fragment21);
list.add(fragment22);
list.add(fragment23);
adapter.setFragments(list);
adapter.notifyDataSetChanged();
适配器:
public class CivilizationViewPagerAdapter extends FragmentPagerAdapter {
private static final java.lang.String TAG = "校园文明";
private String titles[];
private int userType;
private String weekNow;
private OnReloadListener mListener;
private List<Fragment> fgs = null;
FragmentManager fm;
public CivilizationViewPagerAdapter(FragmentManager supportFragmentManager, String[] titles, List<Fragment> fragments) {
super(supportFragmentManager);
this.fgs = fragments;
this.titles = titles;
this.fm = supportFragmentManager;
}
public void setFragments(List<Fragment> fragments) {
if(this.fgs != null){
FragmentTransaction ft = fm.beginTransaction();
for(Fragment f:this.fgs){
ft.remove(f);
}
ft.commit();
ft=null;
fm.executePendingTransactions();
}
this.fgs = fragments;
notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
return fgs.get(position);
}
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public int getCount() {
if (titles == null) return 0;
return titles.length;
}
}
相关文章推荐
- Android Fragment内嵌Fragment页面不刷新数据问题
- FragmentPagerAdapter与FragmentStatePagerAdapter的区别+ViewPager数据刷新问题详解
- 解决Fragment 使用回退栈,返回上一Fragment不刷新有关问题
- 关于FragmentPagerAdapter通知数据改变不刷新的问题
- android fragment页面切换GridView数据不能刷新的问题
- [置顶] Fragment-Fragment切换的数据刷新问题
- Android ViewPager Fragment 切换刷新数据,解决生命周期只走一次的问题
- Android FragmentStatePagerAdapter.notifyDataSetChanged()刷新数据的问题
- 笔记:ViewPager+FragmentPagerAdapter数据刷新问题
- Android FragmentPagerAdapter 数据刷新问题
- SubmitOncePage:解决刷新页面造成的数据重复提交问题
- 解决刷新页面造成的数据重复提交问题
- 有关C语言的数据统计和编程问题 高手请进
- 解决浏览器刷新造成的数据重复提交问题的page扩展类。
- 在Asp.net 2.0 中禁用页面缓存解决页面刷新(重新加载数据)的问题!
- 有关Gridview中统计数据的问题
- 解决刷新页面造成的数据重复提交问题
- 有关不同数据库间数据表的复制问题
- 刷新页面数据自动增加的问题
- 有关Powerdesgner数据模型设计中,属性名同名问题的解决方法