2017-10-23 7 views
4

Ich möchte Ihre Meinung über die Möglichkeiten zur Lösung des Problems mit Android nachschlagen Navigation, die ich versuche zu lösen. Ich habe eine Aktivität (MainActivity) mit RecycleView, die eine scrollbare Liste von Elementen zeigt, die von einer API abgerufen werden. Jedes Element hat einen Onclick Hörer, die die Positionsdetail Aktivität öffnet, etwa so:Nach oben Navigation mit RecycleView

Intent intent = new Intent(context, DetailActivity.class); 
intent.putExtra("item", item); 
context.startActivity(intent); 

DetailActivity hat die Aufwärtstaste, in dem der Benutzer zur vorherige Tätigkeit zurückkehren kann. Hier ist das Manifest für diese Aktivität:

<activity 
    android:name=".DetailActivity" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme.Base" 
    android:parentActivityName=".MainActivity"> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value=".MainActivity" /> 
</activity> 

Und hier ist das Problem: wenn ich an die übergeordneten Aktivität navigieren, ist die Scroll-Liste zurückgesetzt und ist an der Spitze. Wenn ich die Zurück-Taste auf dem Gerät benutze, bleibt die Liste erhalten und die Scroll-Position bleibt erhalten, aber nicht, wenn ich auf die Up-Taste klicke ...

Mir ist klar, dass ich die Scroll-Liste wiederherstellen müsste Halte die Liste der bereits geladenen Artikel irgendwo, übergebe sie vielleicht an die DetailActivity und zurück, aber ich bin mir nicht sicher, ob dies die beste Lösung ist. Gibt es eine bessere, elegantere und nativere Lösung, um die Scroll-Elemente und die Scroll-Position beizubehalten ? Ich habe Android documentation über die Navigation nach oben gelesen, konnte aber nicht die Antwort finden ...

Antwort

4

Wenn die Taste "BACK" ist Was aussieht, geht od mit Ihrer App, dann einfach fangen die "UP" -Event:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 

     case android.R.id.home: 
      // simulate the "BACK" key 
      onBackPressed(); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+0

das ist genau das, was ich gesucht habe, vielen Dank! :) – Oleg

0

Für meine Liste, das ist die Art, wie ich den Index und die Art und Weise, die ich RecyclerView bei diesem Index (bei der oben):

// save index and top position 
int index = mList.getFirstVisiblePosition(); 

View v = mList.getChildAt(0); 
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop()); 

// ... 

// restore index and position 
mList.setSelectionFromTop(index, top); 

Kredit: ian (Stack-Überlauf)

eine Unterliste von bereits geladenen Gegenstände halten für Ihre Anwendung zu schwer wäre ...

+0

Wie Sie die Listenelemente wiederherstellen? Sind sie immer da? In meinem Fall hole ich sie von der API in Blöcken von 20 Elementen ab. Wenn also ein Benutzer zu einer Elementnummer 500 scrollte, müsste ich 500 + 20 Elemente abrufen, wenn der Benutzer nach oben navigiert ... – Oleg

+0

Die Recycler-Ansicht sollte Stellen Sie sie von der angegebenen oberen Position und bis zum letzten in der Aktivität angezeigten Element wieder her. –

+1

Ich habe die andere Antwort als die Lösung markiert, da es so aussieht, als würde man die Liste wiederherstellen, so wie es war, ohne die Position berechnen zu müssen. Bis jetzt funktioniert es, muss auf verschiedenen Geräten testen .. – Oleg

Verwandte Themen