viewPager結合Fragment使用怎麼儲存Fragment的狀態
阿新 • • 發佈:2019-02-07
viewPager和Fragment一起使用的時候需要注意Fragment的狀態儲存和Fragment的資料預載入問題。
- 上一篇文章我眼中的Fragment基類的寫法通過建立Fragment基類解決了Fragment和ViewPager一起使用時的資料預載入問題。
- 但是仔細看我的上一篇文章中關於具體的Fragment寫法中,我通過重寫了setLazy()方法來載入資料,還有關鍵的方法就是在onCreateView方法中,我等fragment的檢視建立完成後,再呼叫了setLazyLoad()方法,確保不會出現資料載入的時候,控制元件還未初始化導致程式報空指標崩潰的錯誤。
到這裡,大家覺得我說的很正確,資料預載入確實是應該這樣做啊。
- 但是如果是結合viewPager使用,當切換不同的fragment的時候,還是會呼叫兩遍setLazy()方法。因為切換不同的fragment的時候,由於viewPager載入頁面的機制,還是會存在fragment重新呼叫onCreate的setLazyLoad()方法,再加上重寫的setLazyLoad()方法,也還是呼叫了兩次。
- 解決方法就是,建立ViewPagerAdapter的時候,重寫相關方法,不用父類的方法,自己根據當前頁面顯示與否呼叫hide和show方法來隱藏和顯示fragment。這樣就不會導致fragment的重複建立和銷燬了,從而可以實現fragment的狀態的儲存。
實現程式碼
/**
* 建立FragmentAdapter繼承FragmentPagerAdapter,並重寫相關方法
*/
private class FragmentAdapter extends FragmentPagerAdapter{
public FragmentAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = fragmentList.get(position);
Bundle bundle = new Bundle();
bundle.putString("id","" + position);
fragment.setArguments(bundle);
return fragment;
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 將例項化的fragment進行顯示即可。
Fragment fragment = (Fragment) super.instantiateItem(container, position);
getSupportFragmentManager().beginTransaction().show(fragment).commit();
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// super.destroyItem(container, position, object);// 註釋父類方法
Fragment fragment = fragmentList.get(position);// 獲取要銷燬的fragment
getSupportFragmentManager().beginTransaction().hide(fragment).commit();// 將其隱藏即可,並不需要真正銷燬,這樣fragment狀態就得到了儲存
}
}
上面有兩個方法很關鍵,在instantiateItem和destroyItem方法裡面,我重寫了自己的邏輯。實現了fragment狀態的儲存。
A little bit of progress every day!Come on!