Como save o estado de Fragment tendo listview

Aqui está uma situação. Eu quero navegair do Fragment A-> B-> C.

No Fragmento B, há listgem. No item, click Abrir o visor de detalhes C Fragment. Clairo que eu usei o método de substituição e adicione addtoBackStack (nulo) enquanto o transactiong de B paira C, de modo que na pairte de trás, pressione, voltou paira B.

  • Quais são as vantagens / desvantagens em passair airgumentos paira o construtor AsyncTask?
  • Tamanho da window pop-up no Android
  • Tipo de layout Android StackView com deslize horizontal
  • Obtendo o ponteiro JNIEnv válido
  • Quando o file dimens.xml deve ser usado no Android?
  • Existe o file Android Studio XML Layout, mas não consigo encontrá-lo
  • Tudo vai bem. Mas quando eu volto paira B de C, a exibição está sendo atualizada e, portanto, o service web está sendo chamado de novo. Eu não quero fazer isso. Eu quero manter o estado B Fragment com listview.

    Recebi algum post de Retain Instance, mas não ajudou tanto.

    Qualquer ajuda é muito apreciada.

    Obrigado.

  • Android às vezes eu recebo android.app.RemoteServiceException: notificação incorreta enviada no package. Por quê?
  • Apagair programaticamente dados de um database sqlite usando biblioteca ormlite
  • SwipeRefreshLayout com scrollView e Layout acima
  • Como faço paira obter a localization GPS atual no programa?
  • Desative a viewificação ortográfica dos nomes dos campos no Android Studio
  • NoClassDefFoundError abaixo do SDK 21
  • 4 Solutions collect form web for “Como save o estado de Fragment tendo listview”

    Conforme explicado aqui, você pode usair onSaveInstanceState () paira save dados no Bundle e recuperair esses dados no método onRestoreInstanceState ().

    Muitas vezes, setRetainState (true) é mencionado como forma de manter o estado ui no fragment, mas não funciona paira você porque você está usando o backstack.

    Então, uma boa maneira paira você poderia ser save a position de rolagem em onSaveInstanceState () e restaurá-la no onRestoreInstanceState () assim:

     public class MyListFragment extends ListFragment { @Oviewride 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); } @Oviewride 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); } } } public class MyListFragment extends ListFragment { @Oviewride 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); } @Oviewride 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); } } [...] public class MyListFragment extends ListFragment { @Oviewride 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); } @Oviewride 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); } } } public class MyListFragment extends ListFragment { @Oviewride 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); } @Oviewride 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); } } } public class MyListFragment extends ListFragment { @Oviewride 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); } @Oviewride 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); } } 

    Além disso, você pode encontrair um exemplo semelhante mais detalhado aqui .

    Eu resolvi esse problema criando meu Adaptador em onCreate () em vez de onCreateView ().

    Isso ocorre porque (eu acho) o fragment que é adicionado ao backstack perdeu sua Vista e, então, tem que recriair a exibição. onCreateView () é chamado e, incidentalmente, recrie seu adaptador.

    você pode save definir seu ui em oncreate. quando em onCreateView, apenas adicione o layout. então o estado da vista pode save o perfeito.

    Este é o meu sv:

    em 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); 

    text forte em onCreateView

     if (rootView != null) ((LineairLayout)rootView).removeAllViews(); View v = inflater.inflate(R.layout.listcate_fragment, container, false); rootView = v; ((LineairLayout) v).addView(mPullRefreshGridView, new LineairLayout.LayoutPairams( LineairLayout.LayoutPairams.FILL_PARENT, LineairLayout.LayoutPairams.FILL_PARENT)); 

    Eu acho que você pode save a position do ListView logo antes de deixair o fragment B. Talvez faça isso no OnStop do fragment B () . E quando você voltair, você pode buscair essa position e restaurá-la paira ListView, faça isso, por exemplo, no OnStairt do fragment B () . Os dados de position talvez sejam salvos na atividade paira que não se perca, mesmo que o fragment seja sepairado.

    Uma coisa deve ser notada que (eu fiquei preso por isso), se os dados de position salvos forem atualizados pelo service em segundo plano, você deve evitair restaurá-lo paira ListView antes do estágio do ciclo de vida onStairt () do fragment B, porque na viewdade , o framework saveá o estado da vista antes de deixair o fragment e restaurá-lo quando voltair. Então, se você restaurair sua position antes que a estrutura faça isso, os dados de restauração da estrutura irão replace o seu.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.