2015-01-16 27 views
5

Mam RecyclerView zarządzany przez LinearlayoutManager, jeśli zamieniam element 1 na 0, a następnie wywołuję mAdapter.notifyItemMoved (0,1), ruchoma animacja powoduje, że ekran zwój. Jak mogę temu zapobiec?Ekran RecyclerView.Adapter.notifyItemMoved (0,1) przesuwa

+0

Miałem ten sam problem z GridLayoutManager, a przyjęta odpowiedź scrollToPosition (po ruchu) to naprawiła! – Matt

Odpowiedz

5

Zadzwoń pod scrollToPosition(0) po przeniesieniu przedmiotów. Niestety, zakładam, że LinearLayoutManager stara się utrzymać stabilny pierwszy przedmiot, który porusza się, więc przesuwa listę za jego pomocą.

+0

Mimo że to rozwiązało mój problem, zapoznaj się z tym https://code.google.com/p/android/issues/detail?id=99047 – Ari

+0

Dziękuję za zgłoszenie. Naprawimy to. Przepraszam za niedogodności. Na szczęście istnieje stosunkowo łatwe obejście tego problemu. Btw, scrollToPosition powoduje przeniesienie widoku do widocznego widoku, więc można go bezpiecznie wywoływać przez cały czas, nawet jeśli nie przenosisz pierwszego elementu. – yigit

+0

Dzięki człowieku! Użyłem ItemTouchHelper do przeciągania przedmiotów i miałem problemy podczas przeciągania pierwszego elementu do drugiego. Z powodu przewijania. Straciłem 3 dni, zastanawiając się, co było nie tak !!! –

1

Niestety obejście przedstawione przez yigit przewija RecyclerView na górę. To jest najlepsze obejście, które znalazłem do tej pory:

// figure out the position of the first visible item 
int firstPos = manager.findFirstCompletelyVisibleItemPosition(); 
int offsetTop = 0; 
if(firstPos >= 0) { 
    View firstView = manager.findViewByPosition(firstPos); 
    offsetTop = manager.getDecoratedTop(firstView) - manager.getTopDecorationHeight(firstView); 
} 

// apply changes 
adapter.notify... 

// reapply the saved position 
if(firstPos >= 0) { 
    manager.scrollToPositionWithOffset(firstPos, offsetTop); 
}