2015-01-16 5 views
5

Ich habe eine RecyclerView verwaltet von einem LinearlayoutManager, wenn ich Element 1 mit 0 tauschen und dann mAdapter.notifyItemMoved (0,1) aufrufen, verursacht die bewegte Animation den Bildschirm zu scrollen. Wie kann ich das verhindern?RecyclerView.Adapter.notifyItemMoved (0,1) scrollt Bildschirm

+0

ich das gleiche Problem mit dem GridLayoutManager hatte, und die akzeptierte Antwort von scrollToPosition (nach dem Umzug) regelte es! – Matt

Antwort

5

Rufen Sie scrollToPosition(0) nach dem Verschieben von Elementen. Leider gehe ich davon aus, dass LinearLayoutManager versucht, das erste Objekt stabil zu halten, was sich so verschiebt, dass es die Liste damit verschiebt.

+0

Obwohl dies mein Problem gelöst hat, werfen Sie einen Blick auf diese https://code.google.com/p/android/issues/detail?id=99047 – Ari

+0

Danke für den Bericht. Wir werden es reparieren. Entschuldigen Sie die Unannehmlichkeiten. Zum Glück gibt es einen relativ einfachen Workaround. Btw, scrollToPosition bringt die Ansicht einfach in das sichtbare Ansichtsfenster, so dass es sicher ist, sie ständig aufzurufen, auch wenn Sie das erste Objekt nicht bewegen. – yigit

+0

Danke Mann! Ich habe ItemTouchHelper zum Ziehen von Objekten verwendet und Probleme beim Ziehen des ersten Objekts in das zweite Element. Wegen Scroll. Verlor 3 Tage herauszufinden, was los war !!! –

1

Leider rollt die Workaround von Yigit die RecyclerView nach oben scrollt. Dies ist die beste Abhilfe, die ich bis jetzt gefunden:

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