Моя задача - реализовать элемент горизонтального элемента в RecyclerView. Я на самом деле справился с задачей благодаря исходному коду ViewPager и некоторым другим ресурсам, но имею проблемы с одним сценарием.RecyclerView, item swiping, java.lang.IllegalStateException
My SwipeableRecyclerView (SRV с этого момента) расширяет RecyclerView и реализует RecyclerView.OnItemTouchListener для выполнения магии, которая на самом деле работает. Он также определяет настраиваемый интерфейс SwipeListener, который определяет несколько методов, наиболее важным (для этого вопроса) является «onSwipe (View view, int position, boolean right)».
Моя деятельность поставляет реализацию интерфейса к СРВУ, и когда салфетки обнаружена и метод слушателя уволен, он выполняет следующие действия:
- перемещает элемент/прокатывается вид с экрана в правильное направление с помощью 'view.animate(). translationX (translationX)'
- В приведенной выше анимации есть слушатель, который в onAnimationEnd удаляет элемент в указанной позиции из адаптера и вызывает адаптер.notifyItemRemoved (position)
- результатом является то, что вид исчезает со стороны, а затем переработчик удаляет строку с ее анимацией - все это очень хорошо работает на самом деле
Проблема возникает, когда я прокручиваю очень быстро, так как в то время, когда первая анимация еще не завершена, я начинаю прокручивать другую строку. Иногда он создает «дыры»/фантомные строки без представления; Иногда, я получаю следующее исключение:
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
и трассировки стека показывает, что adapter.notifyItemRemoved() является метод вызывает исключение.
Для задачи исключения, последовательность событий выглядит следующим образом (из моих отладки следов):
started for position: 11
started for position: 10
finished for position: 11
removing 11
removed 11
finished position: 10
removing 10
Таким образом, обе отделочные анимации запускаются один за другим, и когда один из них вынимает предмет и вызванный notifyItemRemoved, другой законченный и вызвал удаление элемента. Я не совсем уверен, как это может быть так, как все это происходит на основном потоке, на самом деле, но я думаю, что прокрутка также выполняется в кадрах анимации, и это как-то с новыми вычислениями, необходимыми из-за второго удаления.
Итак, я в рассоле, я понятия не имею, что с этим делать. На самом деле, я думаю, что проще всего отключить прикосновения всего вида ресайклера при запуске анимации и включить их снова только после прокрутки. Я не могу отключить SRV, хотя - я попробовал setEnabled (false), clickable и т. Д., Но ничего не работает.
Любая помощь?
Я нашел использование onMoveFinished лучше, так как это учитывает перестановки после того, как элемент удален. – Ljdawson
Означает ли это, что после выполнения onRemoveFinished() выполняется целая последовательность ходов? Я предположил (может быть, ошибочно), что удаление охватывает всю операцию ... – wujek
Я протестировал его, и это действительно так: после onRemoveFinished существует целая куча onMoveFinished вызовов. Спасибо за совет. – wujek