вы повторяете дочерние элементы RecyclerView
(почему дважды? Вы нигде не используете i
, это неэффективно)
for (i in 0 until rv_all.childCount) {
for (j in 0 until rv_all.childCount - 1) {
, но это только View
s - first child / View
находится в позиции 0, второй 1 и c. Когда вы прокручиваете немного вниз и ваш RecyclerView
первый видимый элемент, например, 10-й в alllist
, тогда все еще первый видимый View
находится в позиции 0, как всегда
, поэтому эти строки не имеют смысла:
Collections.swap(alllist,j,j+1)
alladapter.notifyItemMoved(j,j+1)
они всегда меняют местами и уведомляют элементы в начале массива, начиная с 0, но ваш RecyclerView
можно прокрутить немного вниз, например, до 10-го элемента - тогда строки выше меняют элементы в alllist
, но notifyItemMoved
ничего не делает, поскольку RecyclerView
не нужно перерисовывать первые элементы, они «прокручиваются»
короче: позиция View
нарисована в RecyclerView
! = позиция в данных array
вы можете добавить тег "real_position" в адаптере к каждому дочернему элементу, тогда вы все равно можете перебирать видимые дочерние элементы / View
s, получать View
s с findViewByTag
, но swap
и notifyItemMoved
для позиций в массиве данных ("real_position" получено из тега), не видимые дочерние позиции в родительском RecyclerView
var realPosition : Integer = rv_all.getChildAt(j).tag as Integer // set in adapter
Collections.swap(alllist, realPosition, realPosition+1)
alladapter.notifyItemMoved(realPosition, realPosition+1)