最近,遇到了一個問題单匣。
業(yè)務(wù)需求是這樣,需要三個tab宝穗,分別顯示三個頁面户秤,
1.三個頁面分別請求不同的數(shù)據(jù)。
2.主頁面中提供排序功能逮矛,點擊后刷新三個頁面
3.每個Fragment可以單獨刷新
而每次請求數(shù)據(jù)時鸡号,不會重新執(zhí)行Fragment中的代碼。因為在FragmentStatePagerAdapter中须鼎,會去查詢FragmenManager中的Fragment鲸伴,如果其中存在待查詢Fragment的實例,那么就執(zhí)行實例晋控,而不會重新初始化汞窗。
這里采取的方案就是,清理FragmentManager中的實例赡译,這樣每次刷新時都會進行初始化仲吏。傳入相應(yīng)參數(shù)進行相應(yīng)的操作。由于這里只有三個頁面捶朵,每次重新初始化蜘矢,不會有很大的性能損失。
主要的代碼在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的位置沒有改變品腹,默認(rèn)返回
}
@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);
}
//設(shè)置載入的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();
}
}