Почему мой RecyclerView показывает неправильный порядок элементов CardView? - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть RecyclerView объектов CardViews of Food (class). Странная вещь, которая происходит, заключается в том, что когда я использую метод для добавления нового объекта Food в ArrayList, который я использую, и уведомляю адаптер, что значение было добавлено, карта добавляется на экран, но это имеет другой набор значений.

Я использую 2 объекта-заполнителя Food для отображения на экране по умолчанию, и при нажатии кнопки Add предполагается добавить новый объект с именем «Name», но вместо этого я получаю еще одна копия первого заполнителя.

Когда на экран добавлено слишком много Карт, пролистывание вверх и вниз изменяет порядок карт, и внезапно появляются новые элементы (с правильными данными)!

Что не так? Приложение не обрабатывает sh между прочим.

Функция добавления нового объекта Food в ArrayList под названием 'food':

public void addFood(){
   foods.add(new Food("Name",0,3,2)); //a constructor
foodAdapter.notifyItemInserted(0);
}

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Очевидно, проблема заключалась в том, что вызов .add (Object) в элементе ArrayList 'foods' фактически добавлял новый объект в конец списка, в то время как Adapter.notifyItemInserted (0) заставил представление Recycler думать, что Position 0 получил новую карту, тогда как на самом деле это была последняя позиция. Это привело к тому, что в RecyclerView появился неправильный элемент.

Так что, как очевидно, исправлено использование конструктора ArrayList.add (position, object) вместо .add (object) где позиция показывает, где был вставлен новый элемент.

Итак, правильный код:

public void addFood(){
   foods.add(0, new Food("Name", 0, 3, 2)); //a constructor
   foodAdapter.notifyItemInserted(0);
}

Если вы хотите, чтобы новый объект был вставлен в другую позицию, просто передайте эту позицию вместо 0 выше.

0 голосов
/ 06 апреля 2020

вам просто нужно изменить foodAdapter.notifyItemInserted(0) на foodAdapter.notifyDataSetChanged() или foodAdapter.notifyItemInserted(foods.size() - 1).

...