2013-07-23 13 views
12

Oto sytuacja. Chcę nawigować z fragmentu A-> B-> C.Jak zapisać stan fragmentu z listview

W części B znajduje się widok listy. Po kliknięciu pozycji Otwieram szczegółowy fragment C Fragment. Ofcourse Użyłem metody replace i dodałem addtoBackStack (null) podczas transactiong od B do C, tak aby w Back press powrócił do B.

Wszystko idzie dobrze. Ale gdy wracam do B z C, widok jest odświeżany, a zatem usługa jest ponownie wywoływana. Nie chcę tego robić. Chcę zachować stan fragmentu B z widokiem listy.

Otrzymałem trochę postu o Zachowaniu Instancji, ale to nie pomogło tak bardzo.

Każda pomoc jest doceniana.

Dzięki.

+0

Czy przyjrzeliście się użyciu 'Bundle' i Overriding' onSavedInstance() '? – BC2

+0

Witaj @ dakshbhatt21, czy otrzymałeś rozwiązanie swojego problemu? Mam ten sam problem, który mnie dręczy przez tydzień bez przełomu. –

+0

Witam @mungaihkamau proszę sprawdzić te artykuły http://developer.android.com/training/implementing-navigation/index.html, możesz znaleźć różne rodzaje nawigacji podczas pracy z fragmentami, po prostu sprawdź to i daj mi znać. – dakshbhatt21

Odpowiedz

12

Jak wyjaśniono, here można użyć onSaveInstanceState(), aby zapisać dane w pakiecie i pobrać te dane w metodzie onRestoreInstanceState().

Często setRetainState (true) jest wymieniany jako sposób na utrzymanie stanu ui we fragmencie, ale nie działa on dla ciebie, ponieważ używasz tego backstacka.

więc dobrym sposobem dla Ciebie może być, aby zapisać scrollPosition w onSaveInstanceState() i przywrócić go w onRestoreInstanceState() tak:

public class MyListFragment extends ListFragment { 

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

    int index = this.getListView().getFirstVisiblePosition(); 
    View v = this.getListView().getChildAt(0); 
    int top = (v == null) ? 0 : v.getTop(); 

    outState.putInt("index", index); 
    outState.putInt("top", top); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    [...] 
    if (savedInstanceState != null) { 
     // Restore last state for checked position. 
     index = savedInstanceState.getInt("index", -1); 
     top = savedInstanceState.getInt("top", 0); 
    } 
    if(index!=-1){ 
    this.getListView().setSelectionFromTop(index, top); 
    } 

} 

Co więcej można znaleźć bardziej szczegółowe similiar przykład here.

+1

+1 To naprawdę działa GREATE :) –

+0

@alex To nie działa dla mnie. Mam przycisk listy w wyszukiwaniu (dolny pasek). Mój widok listy zostanie odtworzony po kliknięciu przycisku wyszukiwania poniżej. Nie mogę zapisać stanu widoku listy. Pomóż mi .. –

+0

Czy możesz opublikować swój układ xml i pokazać swój kod. Lepiej jest zacząć nowe pytanie, aby to zrobić i powiązać ten wątek z pytaniem jako "podobny" – alex

0

Możesz zapisać zdefiniować swój ui w oncreate. w trybie onCreateView, tylko dodaj układ. , więc stan widoku można zapisać idealnie.

to moja sv:

w onCreate

LayoutInflater inflater = (LayoutInflater) 
      ctx.getSystemService(ctx.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.pulltorefreshgridview, null); 
    mPullRefreshGridView = (PullToRefreshGridView) view 
      .findViewById(R.id.listcate_pullrefresh_gridview); 

silnego tekstu w onCreateView

if (rootView != null) ((LinearLayout)rootView).removeAllViews(); 
View v = inflater.inflate(R.layout.listcate_fragment, container, false); 
rootView = v; 


    ((LinearLayout) v).addView(mPullRefreshGridView, 
      new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.FILL_PARENT, 
        LinearLayout.LayoutParams.FILL_PARENT)); 
0

myślę, że można zapisać pozycję ListView tuż przed Wyjeżdżasz fragment B. Może to zrobić w części B onStop(). A kiedy wrócisz, możesz pobrać tę pozycję i przywrócić ją do ListView, zrób to na przykład w fragmencie B: onStart(). Dane pozycji mogą zostać zapisane w Aktywności, więc nie zostaną utracone nawet po odłączeniu fragmentu.

Jedno należy zauważyć, że (Byłem uwięziony przez to), jeśli zapisane dane stanowisko jest aktualizowana przez usługę tła, należy unikać przywrócenie go do ListView przed etapem cyklu życia onStart() fragmentu B, ponieważ w rzeczywistości framework zapisze stan widoku tuż przed opuszczeniem fragmentu i przywróci go po powrocie. Jeśli więc przywrócisz swoją pozycję, zanim środowisko to zrobi, dane przywracania w ramce zastąpią twoje.

2

Rozwiązałem ten problem, tworząc mój Adapter na onCreate() zamiast onCreateView().

To dlatego, że (jak sądzę) fragment dodany do backstacka stracił swój widok, a następnie musi odtworzyć widok. onCreateView() zostaje wywołany i przypadkowo ponownie tworzy twój adapter.