Frage So speichern Sie den Status von Fragment mit Listenansicht


Hier ist eine Situation. Ich möchte von Fragment A-> B-> C navigieren.

In B-Fragment gibt es eine Listenansicht. Beim Klick auf den Gegenstand öffne ich die Detailansicht C Fragment. Natürlich habe ich die Methode replace verwendet und addtoBackStack (null) hinzugefügt, während ich von B nach C getauscht habe, so dass ich auf Back zurück zu B kam.

Alles wird Gut. Aber wenn ich von C nach B zurückkehre, wird die Ansicht aktualisiert und der Webservice wird erneut aufgerufen. Ich möchte das nicht tun. Ich möchte den B-Fragment-Status mit Listview beibehalten.

Ich habe Post von Retain Instance bekommen, aber es hat nicht viel geholfen.

Jede Hilfe wird sehr geschätzt.

Vielen Dank.


12
2017-07-23 12:53


Ursprung


Antworten:


Wie erklärt Hier Sie können onSaveInstanceState () verwenden, um Daten im Bundle zu speichern und diese Daten in der onRestoreInstanceState () -Methode abzurufen.

Oft wird setRetainState (true) als Möglichkeit erwähnt, den ui-Status im Fragment zu behalten, aber es funktioniert nicht, weil Sie das Backstack verwenden.

Ein guter Weg für Sie könnte also sein, die scrollposition in onSaveInstanceState () zu speichern und in onRestoreInstanceState () wie folgt wiederherzustellen:

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

}

Weiter finden Sie ein detaillierteres ähnliches Beispiel Hier.


12
2017-07-23 13:27



Ich habe dieses Problem gelöst, indem ich meinen Adapter onCreate () anstelle von onCreateView () erstellt habe.

Das liegt daran, dass (denke ich) das Fragment, das dem Backstack hinzugefügt wurde, seine View verloren hat und dann die View neu erstellen muss. onCreateView () wird aufgerufen und erstellt zufällig Ihren Adapter neu.


2
2017-12-31 15:36



Sie können speichern, definieren Sie Ihre UI in oncreate. Fügen Sie in onCreateView nur das Layout hinzu. so kann der Ansichtszustand perfekt speichern.

Das ist mein sv:

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

starker Text in 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
2017-11-08 13:29



Ich denke, du kannst die Position deiner ListView speichern, bevor du Fragment B verlässt. Mach das vielleicht in Fragment Bs onStop (). Und wenn Sie zurückgehen, können Sie diese Position abrufen und sie in ListView wiederherstellen, z. B. in Fragment B am Start(). Die Positionsdaten können bei der Aktivität gespeichert werden, so dass sie nicht verloren gehen, selbst wenn das Fragment abgetrennt wurde.

Eine Sache sollte bemerkt werden, dass (wenn ich dadurch in die Falle geraten bin), sollten die gespeicherten Positionsdaten vom Hintergrunddienst aktualisiert werden, sollten Sie es vermeiden, sie vor der Lebenszyklusphase in ListView wiederherzustellen am Start() von Fragment B, weil das Framework tatsächlich den Zustand der Ansicht speichert, kurz bevor das Fragment verlassen wird, und es wiederherstellen, wenn es zurückkommt. Wenn Sie also Ihre Position vor dem Framework wiederherstellen, überschreiben die Wiederherstellungsdaten des Frameworks Ihre.


0
2017-12-25 14:04