2016-04-12 12 views
11

Mam widok Recykler, który znajduje się wewnątrz SwipeRefreshLayout. Mają także możliwość otwierania każdego przedmiotu w innym działaniu. Po powrocie do Recyklera muszę przewinąć do wybranej pozycji lub do poprzedniej Y. Jak to zrobić?Jak zapisać pozycję przewijania RecyclerView w systemie Android?

Tak, użyłem go w wyszukiwarce, znalazłem artykuły w StackOverFlow dotyczące zapisywania instancji menedżera układu, takie jak to: RecyclerView store/restore state between activities. Ale to mi nie pomaga.

UPDATE

Teraz mam tego rodzaju rozwiązanie problemu, ale, oczywiście, to też nie działa.

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

Tak, próbowałem scrollTo (int, int) - nie pracuję.

Teraz próbowałem po prostu przewinąć, na przykład, do Y = 100, ale nie przewija się wcale.

+1

proszę umieszczać kodu & co osiągnąłeś do tej pory. – yennsarah

+0

Możliwy duplikat [jak zapisać pozycję przewijania recyclerview, z recyclerview.state lub nie] (http://stackoverflow.com/questions/27816217/how-to-save-recyclerview-scroll-position-w-recyclerview-state- lub-nie) –

+0

@MadhukarHebbar Sprawdziłem to i nie działa również ... – DefaultXYZ

Odpowiedz

29

zapisać aktualny stan stanowiska widzenia recyklingu @ onPause:

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

Przywracanie @onResume pozycję przewijania:

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

czy inny sposób mogą być @onPause:

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

przywrócić @onResume:

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

Pierwsze rozwiązanie zadziałało, dzięki! – benzabill

+1

Świetne rozwiązanie .. !! –

2

użytkownika Twoja firma recyklingowa widok linearlayoutmanager uzyskania pozycję przewijania

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

i podczas przywracania wykorzystania podany kod

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

nadzieję, że to pomaga

+0

przepraszam, ale ta odpowiedź była pierwsza w komentarzach pod moim pytaniem. – DefaultXYZ

9

Wiele z tych odpowiedzi zdają się być ponad komplikowaniem.

System LayoutManager obsługuje onRestoreInstanceState po wyjęciu z pudełka, więc nie trzeba zapisywać pozycji przewijania itp. Wbudowana metoda już zapisuje piksele w doskonałych pozycjach.

przykład fragment kodu (null sprawdzanie itp usunięte dla jasności):

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

} 

następnie zadzwoń

list.getLayoutManager().onRestoreInstanceState(listState); 

raz dane zostały ponownie przyłączone do RecyclerView

+1

WoW! Proste i proste rozwiązanie :) –

+0

Myślę, że to najlepsze rozwiązanie !! – illusionJJ

+0

Musiałem dodać "android: configChanges =" orientation | screenSize "" do AndroidManifest.xml. Niż powyższy kod zadziałał. Dzięki –

Powiązane problemy