2016-04-12 17 views
11

Ich habe Recycler-Ansicht, die innerhalb von SwipeRefreshLayout liegt. Außerdem haben Sie die Möglichkeit, jedes Element in einer anderen Aktivität zu öffnen. Nachdem ich zurück zu Recycler zurückgekehrt bin, muss ich zum vorgewählten Einzelteil oder zum vorhergehenden Y scrollen. Wie man das macht?Wie Scroll-Position von RecyclerView in Android speichern?

Ja, ich habe gegooglet, gefunden Artikel in StackOverFlow über Speichern von Instanz des Layout-Manager, wie dieser: RecyclerView store/restore state between activities. Aber es hilft mir nicht.

UPDATE

Im Moment habe ich diese Art von Problem zu lösen, aber natürlich, es funktioniert auch nicht.

private int scrollPosition; 

...//onViewCreated - it is fragment 
recyclerView.setHasFixedSize(true); 
LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
recyclerView.setLayoutManager(llm); 
data = new ArrayList<>(); 
adapter.setData(getActivity(), data); 
recyclerView.setAdapter(adapter); 
... 

@Override 
public void onResume() { 
    super.onResume(); 
    recyclerView.setScrollY(scrollPosition); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    scrollPosition = recyclerView.getScrollY(); 
} 

Ja, ich habe versucht scrollTo (int, int) - do'nt't arbeiten.

Jetzt habe ich versucht nur scrollen, zum Beispiel zu Y = 100, aber es scrollt überhaupt nicht.

+1

Bitte senden Sie Ihren Code wieder angebracht worden & Was hast du bisher erreicht? – yennsarah

+0

Mögliches Duplikat von [So speichern Sie die Recyclerview-Bildlaufposition mit recyclerview.state oder no] (http://stackoverflow.com/questions/27816217/how-to-save-recyclerview-scroll-position-with-recyclerview-state- oder-nein) –

+0

@MadhukarHebbar Ich habe es überprüft, und es funktioniert auch nicht ... – DefaultXYZ

Antwort

29

Save hilft @ onPause:

positionIndex= llManager.findFirstVisibleItemPosition(); 
    View startView = rv.getChildAt(0); 
    topView = (startView == null) ? 0 : (startView.getTop() - rv.getPaddingTop()); 

die Bildlaufposition @onResume Restore:

if (positionIndex!= -1) { 
     llManager.scrollToPositionWithOffset(positionIndex, topView); 
    } 

oder eine andere Art und Weise @onPause sein kann:

long currentVisiblePosition = 0; 
currentVisiblePosition = ((LinearLayoutManager)rv.getLayoutManager()).findFirstCompletelyVisibleItemPosition(); 

wiederherstellen @onResume:

((LinearLayoutManager) rv.getLayoutManager()).scrollToPosition(currentVisiblePosition); 
currentVisiblePosition = 0; 
+1

Erste Lösung funktioniert, danke !! – benzabill

+1

Große Lösung .. !! –

2

Benutzer Ihre Recycler Ansicht linearlayoutmanager für Scrollposition

int position = 0; 
if (linearLayoutManager != null) { 
    scrollPosition = inearLayoutManager.findFirstVisibleItemPosition(); 
} 

bekommen und bei der Wiederherstellung Verwendung folgenden Code

if (linearLayoutManager != null) { 
    cardRecyclerView.scrollToPosition(mScrollPosition); 
} 

Hope this Sie den aktuellen Stand der recycle Ansicht Position

+0

Sorry, aber diese Antwort war zuerst in den Kommentaren unter meiner Frage. – DefaultXYZ

9

Viele dieser Antworten scheinen sei über das Komplizieren.

Der LayoutManager unterstützt onRestoreInstanceState out of the box, so dass Scroll-Positionen nicht gespeichert werden müssen. Die integrierte Methode speichert bereits Pixel perfekte Positionen.

Beispiel Fragment Code (null Kontrolle usw. zur Klarheit entfernt):

private Parcelable listState; 
private RecyclerView list; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    listState=savedInstanceState.getParcelable("ListState"); 

} 

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

    outState.putParcelable("ListState", list.getLayoutManager().onSaveInstanceState()); 

} 

dann rufen Sie einfach

list.getLayoutManager().onRestoreInstanceState(listState); 

einmal Ihre Daten zu Ihrem RecyclerView

+1

WoW! Einfache und einfache Lösung :) –

+0

Ich denke, das ist die beste Lösung !! – illusionJJ

+0

Ich musste 'android: configChanges =" orientation | screenSize "' zu AndroidManifest.xml hinzufügen. Dann funktionierte der obige Code. Danke –

Verwandte Themen