RecyclerView всегда удаляет последний элемент из вида и ошибки при удалении элемента в позиции 0 - PullRequest
0 голосов
/ 02 февраля 2019

Я боролся с RecyclerView в течение последних 2 дней.В отличие от всех прошлых периодов, я хочу провести пальцем, чтобы отключить функциональность.

Я следовал этому руководству

Единственное отличие, которое я здесь реализовал, - это вместо использованияпредопределенный массив для ввода, у меня есть ответ API для заполнения данных.Все, что кажется хорошим, когда я открываю окно утилизации, пункты заполняются так, как должны.В том порядке, в котором они должны быть.

Вот здесь и начинается самое интересное.Если я пытаюсь провести пальцем, чтобы отклонить первый элемент, я получаю ошибку IndexOutOfBounds.Это мило, поиск, я обнаружил, что некоторые решили установить новый список на основе первого списка, удалить элемент, а затем переназначить исходный список в новый список.notifyDataSetChanged () когда закончите.Больше нет ошибки, НО нет анимации представления рециркулятора, чтобы вывести 2-й элемент в верхнюю часть списка.всякий раз, когда notifyDataSetChanged () вызывается, список НЕ перемещается.Я прокручиваю вниз и назад, и предмет возвращается.Или так я подумал.

Поработав некоторое время с этим, я заметил, что хотя информация в первом элементе оказалась исходным первым элементом, она получила идентификатор второго элемента в списке ипоследний элемент в представлении теперь отсутствует.

Вот пример:

  1. text = Fox id = a
  2. text = Dog id = b
  3. text = Pig id = c

Я проведу пальцем, отклоняя 1 из списка, это то, что показывает пользовательский интерфейс

  1. text = Fox id = b
  2. text = Dog id = c

Множество кода для встраивания здесь и его ошибки при попытке сделать это, суть здесь https://gist.github.com/baggednismo/2840d0f777438d29673bc29096153970

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

@ Скотт Стэнчфилд был очень прав в своих словах.Отмеченные изменения в его комментариях и ответах очистили представление, чтобы помочь мне найти фактическую проблему, связанную с представлением.Предложения по-прежнему реализованы и являются частью решения.

onBindViewHolder () создал представление элементов, для которых он создавал позиции, на основе исходного порядка ответов API, а не обработчика, который обрабатывал просмотр списка.onBindViewHolder () вызывается каждый раз, когда новый элемент появляется в списке при прокрутке, и это было проблемой.Это прекрасно работает при первой инфляции в списке, однако, как только элемент был удален и прокрутил его вверх, первый элемент оказался отклоненным.

Оригинал:

KitchenOrdersResponse.Item mItem = mKitchenOrdersResponse.getItems().get(i);

Разрешение:

KitchenOrdersResponse.Item mItem = mItems.get(i);
0 голосов
/ 02 февраля 2019

Попробуйте удалить setHasStableIds(true) и переопределенный getItemId() из вашего адаптера.

Вы говорите RecyclerView, что представление n th всегда будет представлять один и тот же элемент всписок, и он расстраивается, когда вы удаляете один из элементов.

(Я только что попробовал очень упрощенный пример с setHasStableIds(true) и получил аналогичное исключение; он работал нормально, когда я удалил его и getItemId())

Обратите внимание, что ваш вызов notifyItemDeleted() предпочтительнее, чем замена всего списка, но если вы действительно хотите или должны заменить весь список, вам следует взглянуть на использование DiffUtil, чтобы определить и сделатьвнесите соответствующие изменения в список, и он выполнит всю классную анимацию, если все еще присутствуют те же элементы.

Если вы хотите увидеть мой пример, он находится на https://gist.github.com/javadude/dec1862b075338790f023b42e01fd953 (но он в котлине)

...