最近,遇到了一个问题。
业务需求是这样,需要三个tab,分别显示三个页面,
1.三个页面分别请求不同的数据。
2.主页面中提供排序功能,点击后刷新三个页面
3.每个Fragment可以单独刷新
而每次请求数据时,不会重新执行Fragment中的代码。因为在FragmentStatePagerAdapter中,会去查询FragmenManager中的Fragment,如果其中存在待查询Fragment的实例,那么就执行实例,而不会重新初始化。
这里采取的方案就是,清理FragmentManager中的实例,这样每次刷新时都会进行初始化。传入相应参数进行相应的操作。由于这里只有三个页面,每次重新初始化,不会有很大的性能损失。
主要的代码在Adapter中,
public class FragmentAdapter extends FragmentStatePagerAdapter {
private List<Fragment> mFragments;
private List<String> mTitles;
private FragmentManager fm;
private List<String> mTagList = new ArrayList<>();
private boolean[] fragmentsUpdateFlag = { false, false, false, false };
public FragmentAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titles) {
super(fm);
this.fm = fm;
mFragments = fragments;
mTitles = titles;
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
//POSITION_NONE 表示item不显示了
//POSITION_UNCHANGED 表示item的位置没有改变,默认返回
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitles.get(position);
}
public void updateData(List<Fragment> fragments){
setFragments(fragments);
}
//设置载入的Fragment
private void setFragments(List<Fragment> mFragments){
if (this.mFragments != null){
//清理Fragment中的缓存
FragmentTransaction fragmentTransaction = fm.beginTransaction();
for (Fragment f : this.mFragments){
fragmentTransaction.remove(f);
}
fragmentTransaction.commit();
fm.executePendingTransactions();
}
this.mFragments = mFragments;
notifyDataSetChanged();
}
}