7

私のListViewがスクロール位置を失っているViewPagerに問題があります。ViewPagerをスワイプすると、フラグメントは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

更新12/17/11:
私は実際にはフラグメントの内容を保存するための正しい方法を発見しました。 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は、リストをスワイプしながら各フラグメントをデタッチしますが、ユーザーがスワイプしたときに簡単に再接続できるようにメモリに保持します。 FragmentPagerAdapterはそれを削除するので検討する価値がありますが、ユーザーが再びスワイプするときに再構築する必要があるという欠点があります。したがって、FragmentPagerAdapterは意味がありますが、大きなセットに対してはFragmentStatePagerAdapterを考慮してください。 (Android Dev Blog) –

関連する問題