2013-08-31 55 views
5

我使用ViewPagerFragmentStatePagerAdapter來顯示片段。最初有2個片段添加Fragment1和Fragment2,第3個片段Fragment3在收到來自服務器的響應後被添加到第2個位置。因此,在添加所有頁面後,這應該是ViewPager中的碎片序列 - > Fragment1,Fragment3,Fragment2。ViewPager屏幕旋轉時保留舊片段

問題是在Fragment1和Fragment3被添加和應用程序正在服務器調用之前添加第3個片段在第2個位置,如果我做屏幕旋轉多次,然後在第3個片段添加它仍然顯示Fragment2的舊副本在第2最初位置在第二位和第三位有Fragment2的新副本。所以Fragment3 doest顯示在ViewPager中。添加第3個片段後的序列 - > Fragment1,Fragment2的新副本,New Fragment2。

我重寫onSaveInstanceState並在我的活動中調用super.onSaveInstanceState

我還試着從getItemPosition返回POSITION_NONE。我在某處閱讀ViewPager保存片段的副本。同樣通過調試,我檢查了ViewPager在複製問題時包含2份Fragment2,即使getItemFragmentStatePagerAdapter爲每個位置返回不同的片段,但仍然在第二個位置顯示舊的片段。爲了在getItem中進行測試,我爲所有職位返回了Fragment1,這樣所有3個頁面應該都是相同的,但是在第二個位置之後,當我使用上述步驟再現問題時,它顯示的是Fragment2的舊副本。

那麼如何清除ViewPager以便它不保存舊的碎片。如何刷新ViewPager,以便它不保留帶有碎片的舊副本。我認爲問題是與onSaveInstanceState,但我需要它。當視圖保存在onSaveInstanceState中時,如何排除ViewPager。我試過mViewPager.setSaveEnabled(false)但它佔用太多內存。

我發現問題是instantiateItem適配器的方法沒有調用getItem,因爲返回了舊的片段。

下面是解決方案代碼

代碼:

@Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      Object obj = super.instantiateItem(container, position); 
      Fragment fragment = mFragments.get(position); 

      if((obj!=null && fragment!=null) && !(obj.getClass().getSimpleName().equals(fragment.clss.getSimpleName()))){ 
       destroyItem(container, position, obj); 
       return super.instantiateItem(container, position); 
      }else{ 
       return obj; 
      } 
     } 
+0

你檢查[呢?](http://stackoverflow.com/a/9646622/1396082) –

+0

你刪除了你的評論..現在它爲你工作? –

+0

問題是適配器的instantiateItem方法由於返回了舊片段而未調用getItem。我正在尋找一種方法使其調用getItem。 – anujprashar

回答

1

我解決了這個問題,我在這裏發佈我的解決方案。我重寫instantiateItemFragmentStatePagerAdapter,在它裏面,我得到super.instantiateItem的對象,並將它的類名與我正在維護的片段列表中該對象的類名進行比較。

如果classname不相同,則表示super.instantiateItem的平均值將返回重複的片段。所以我在該位置打電話destroyItem,並再次撥打super.instantiateItem並從instantiateItem返回。

FragmentStatePagerAdapter返回舊的片段,因爲在框架代碼arraylist mFragments有重複的片段,它只是在當前位置返回片段。我認爲它應該比較片段在列表中的位置和當前顯示的片段,然後返回它。

+2

你能告訴我一些(虛擬)代碼嗎?我不明白你的解決方案,只是用文字(對不起,英文不好)。 – Poutrathor

+0

@Poutrathor對不起,延遲迴復。我在答案中添加了代碼。 – anujprashar

+0

可以請您發佈代碼嗎? – k2ibegin

2

只有在FragmentpagerAdapter

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
     // TODO Auto-generated method stub 
     super.destroyItem(ViewGroup container, int position, Object object); 
} 

重寫此方法,然後從你的代碼中刪除super.destroyItem(ViewGroup container, int position, Object object);