最近遇到一個需求,主頁采用ViewPager+Fragment的主頁蟀拷。用戶在設(shè)置中可以動態(tài)修改ViewPager的Fragment碰纬。原本以為只是動態(tài)修改數(shù)據(jù)源,然后調(diào)用notifyDataSetChanged()就可以了问芬。然鵝并不是這樣悦析。
簡單記錄一下最后的解決方案:
初始化數(shù)據(jù)的時候,創(chuàng)建所有可能會出現(xiàn)的Fragment
walletFragment = new WalletFragment();
washFragment = new WashFragment();
userFragment = new UserFragment();
partnerFragment = new PartnerFragment();
fragments.add(walletFragment);
fragments.add(washFragment);
if (currentUser == AppConstant.user) {
fragments.add(userFragment);
} else {
fragments.add(partnerFragment);
}
vpMain.setOffscreenPageLimit(3);
mainPagerAdapter = new MainPagerAdapter(getSupportFragmentManager(), fragments);
vpMain.setAdapter(mainPagerAdapter);
tabMain.setCurrentTab(1);
vpMain.setCurrentItem(1, false);
主要在Adapter中處理
public class MainPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments;
public MainPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public long getItemId(int position) {
return fragments.get(position).hashCode();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
重點是這兩個方法 getItemId()
和getItemPosition()
通過這兩個方法來解決adapger的緩存問題此衅。
最后在切換的時候調(diào)用
private void switchUser(int eventIntData) {
if (eventIntData == AppConstant.user) {
//刪除商戶 添加用戶
if (fragments.contains(partnerFragment)) {
fragments.remove(partnerFragment);
fragments.add(2, userFragment);
}
} else if (eventIntData == AppConstant.partner) {
//刪除用戶 添加商戶
if (fragments.contains(userFragment)) {
fragments.remove(userFragment);
fragments.add(2, partnerFragment);
}
}
mainPagerAdapter.notifyDataSetChanged();
}