1. 程式人生 > >viewPager結合Fragment使用怎麼儲存Fragment的狀態

viewPager結合Fragment使用怎麼儲存Fragment的狀態

viewPager和Fragment一起使用的時候需要注意Fragment的狀態儲存和Fragment的資料預載入問題。
  • 但是仔細看我的上一篇文章中關於具體的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!