7

我遇到了ViewPager的問題,我的ListView失去了它的滾動位置。滑動ViewPager時,Fragment不會調用onSaveInstanceState?

ListView控件的狀態可以很容易地存儲和使用恢復:

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.frag_cool_things, container, false); 

    AdvListView listView = (AdvListView) v.findViewById(R.id.lv0); 
    listView.setOnItemClickListener(mOnListItemClicked); 

    if (null != savedInstanceState) 
    { 
     listView.onRestoreListViewInstanceState(savedInstanceState.getParcelable("list_state")); 
    } 

    mListView = listView; 

    return v; 
} 

@Override 
public void onSaveInstanceState (Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 

    outState.putParcelable("list_state", mListView.onSaveListViewInstanceState()); 
} 

然而,問題是,當片段被偷走onDestroyView()被調用,但永遠不會調用onSaveInstanceState (Bundle outState)

旋轉屏幕等恢復ListView狀態很好,但刷卡我無法弄清楚如何正確地恢復列表。

回答

15

更新11年12月17日:
我居然找到了正確的方法來保存片段的內容。您必須使用FragmentStatePagerAdapter。該適配器正確保存了片段的狀態! :)

OLD:
好吧,我發現了一個辦法做到這一點。如果你認爲這是一個巨大的,不,不請分享您的輸入! :P

這裏是我FragmentBase類,修復了這個問題:

public abstract class FragmentBase extends Fragment 
{ 
    private boolean mInstanceAlreadySaved; 
    private Bundle mSavedOutState; 

    @Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     if (null == savedInstanceState && null != mSavedOutState) { 
      savedInstanceState = mSavedOutState; 
     } 

     mInstanceAlreadySaved = false; 
     return onCreateViewSafe(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onSaveInstanceState (Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     mInstanceAlreadySaved = true; 
    } 

    @Override 
    public void onStop() 
    { 
     if (!mInstanceAlreadySaved) 
     { 
      mSavedOutState = new Bundle(); 
      onSaveInstanceState(mSavedOutState); 
     } 

     super.onStop(); 
    } 

    public abstract View onCreateViewSafe (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); 
} 
+0

我自己的臨時解決方案是隻寫我的東西在的onPause()的SharedPreferences,並在OnCreateView讓他們回來(... )。但是,這會迫使您訪問附加活動以獲取Sharedpreferences(getActivity()。getSharedPreferences(...)),並且您可能還需要在活動被拆除時顯式刪除不需要的內容(具體取決於您的操作存儲,ofc)。希望有人有更好的方法! :) –

+0

請參閱更新回答:) – Jona

+0

「當您滑過列表時,FragmentPagerAdapter會分離每個片段,但將它們保存在內存中,以便在用戶向後滑動時可以簡單地重新附加它們。如果碎片數量較多, FragmentStatePagerAdapter值得考慮,因爲它將刪除它們,缺點是當用戶滑回到它們時需要重建。因此,如果FragmentPagerAdapter具有更少,更復雜的片段,但考慮使用FragmentStatePagerAdapter來處理更大的集合。 (Android開發人員博客) –

相關問題