7

Mam problem z ViewPager, gdzie mój ListView traci pozycję przewijania.Fragment nie wywołuje metody onSaveInstanceState podczas przesuwania programu ViewPager?

Stan ListView mogą być łatwo zapisane i przywrócone przy użyciu:

@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()); 
} 

Jednak problemem jest to, że kiedy fragmenty są przeciągnął onDestroyView() jest wywoływana, ale nigdy nie zwraca onSaveInstanceState (Bundle outState).

Obracanie ekranu i takie przywraca stan ListView dobrze, ale przesuwając Nie mogę wymyślić, jak poprawnie przywrócić listę.

Odpowiedz

15

Aktualizacja 17.12.11:
I rzeczywiście znaleźć właściwą drogę, aby zapisać zawartość fragmentów. Musisz użyć FragmentStatePagerAdapter. Ten adapter właściwie zapisuje stan fragmentu! :)

OLD:
Dobrze znalazłem sposób to zrobić .. Proszę podzielić swój wkład, jeśli uważasz, że jest to ogromny, nie, nie! : P

Oto moja klasa FragmentBase że ustalony ten problem:

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

Moje własne rozwiązanie tymczasowe, to po prostu napisać moje rzeczy do SharedPreferences w OnPause(), i uzyskać je z powrotem w OnCreateView (...). To jednak zmusza cię do uzyskania dostępu do działania dołączania w celu uzyskania właściwości SharedPreferences (getActivity(). GetSharedPreferences (...)), a także może być konieczne jawne usunięcie niepożądanych rzeczy, gdy działanie zostanie zerwane (w zależności od tego, co robisz przechowywanie, ofc). Mam nadzieję, że ktoś ma lepszy sposób! :) –

+0

Proszę zobaczyć zaktualizowaną odpowiedź :) – Jona

+0

"FragmentPagerAdapter odłączy każdy fragment podczas przesuwania po liście, ale zachowa je w pamięci, aby można było je po prostu ponownie dołączyć, gdy użytkownik odsuwa z powrotem .Jeśli masz większą liczbę Fragmentów, FragmentStatePagerAdapter jest warty rozważenia, ponieważ usunie je, a wadą jest to, że trzeba je przebudować, kiedy użytkownik odsuwa je z powrotem, więc jeśli masz mniej, bardziej złożonych fragmentów, FragmentPagerAdapter ma sens, ale rozważ FragmentStatePagerAdapter dla większych zestawów. " (Blog Androida Dev) –

Powiązane problemy