我使用ViewPager
和FragmentStatePagerAdapter
來顯示片段。最初有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,即使getItem
的FragmentStatePagerAdapter
爲每個位置返回不同的片段,但仍然在第二個位置顯示舊的片段。爲了在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;
}
}
你檢查[呢?](http://stackoverflow.com/a/9646622/1396082) –
你刪除了你的評論..現在它爲你工作? –
問題是適配器的instantiateItem方法由於返回了舊片段而未調用getItem。我正在尋找一種方法使其調用getItem。 – anujprashar