您的位置:首页 > 编程语言 > PHP开发

有关FragmentPagerAdapter适配器中的fragment数据刷新问题

2016-11-02 16:38 411 查看
有很多时候会需要用到选项卡式的布局,如果没有特殊情况一般不需要在viewpager所在activity中更改数据。但是如果需要更改刷新数据如何处理?比如我加个筛选项就需要实时的刷新fragment中的数据。

当数据发生改变调用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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: