2015-01-16 3 views
5

У меня есть RecyclerView, управляемый LinearlayoutManager, если я заменяю элемент 1 на 0, а затем вызываю mAdapter.notifyItemMoved (0,1), движущаяся анимация заставляет экран прокрутки. Как я могу это предотвратить?RecyclerView.Adapter.notifyItemMoved (0,1) scrolls screen

+0

Я была такая же проблема с GridLayoutManager, и принятый ответ scrollToPosition (после переезда) установил ее! – Matt

ответ

5

Звоните scrollToPosition(0) после перемещения элементов. К сожалению, я полагаю, LinearLayoutManager пытается сохранить первый элемент стабильным, который перемещается, поэтому он перемещает список с ним.

+0

Хотя это решило мою проблему, взгляните на это https://code.google.com/p/android/issues/detail?id=99047 – Ari

+0

Спасибо за отчет. Мы это исправим. Приносим извинения за неудобства. К счастью, существует относительно простое решение. Btw, scrollToPosition просто отображает вид на видимый видовой экран, так что безопасно вызывать его все время, даже если вы не перемещаете первый элемент. – yigit

+0

Спасибо, человек! Я использовал ItemTouchHelper для перетаскивания элементов и имел проблемы при перетаскивании первого элемента во второй. Из-за свитка. Потеряно 3 дня, выясняя, что было не так !!! –

1

К сожалению, обходной путь, представленный yigit, прокручивает RecyclerView к началу. Это лучший обходной путь я нашел до сих пор:

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