У меня странный случай с recyclerView (с GridLayoutManager). Когда я удаляю элемент и обновляю его с помощью (notifyItemRemoved и notifyItemRangeChanged/notifyDataSetChanged), он не удаляет элемент, а помечает его для удаления (он выделен серым цветом). Если элемент не последний, то он как бы удаляется, но не совсем - он просто под другим элементом и не виден (если добавить к этому элементу дополнительный вид - видно, что он там есть), но если он последний вы можете видеть, что это серым цветом.
Я не первый раз работаю с recyclerView и раньше с ним не сталкивался, но с GridLayoutManager впервые, так что это может быть причиной.
Я отладил код и ясно вижу, что список элементов содержит правильные элементы (4) после удаления 5-го в onBindViewHolder, когда он воссоздает recyclerView после обновления.
Вот функция удаления, когда нажимается отмеченный значок, он получает значок X и появляется диалоговое окно.
private class DeleteMessageDialog extends MessageDialog {
List<Item> expenses;
public DeleteMessageDialog(String message, List<Item> expenses) {
super(DELETE_CATEGORY, WARNING, message, activity);
this.expenses = expenses;
}
@Override
protected void okPressed() {
DataHelper.getDataHelper(activity).removeItems(expenses);
viewBuilder.refreshItems(DELETE_ITEM);
dismiss();
}
}
Метод обновления (я жестко запрограммировал 4 - такое же быстрое и грязное решение, как и до того, как у меня было notifyDataSetChanged) и изменил значения в соответствии с комментарием Phuc:
public void refreshItems(Enums.Action action) {
dataHelper.setListOfCategoryItems();
List<Category> categoryItems = Utils.getCategoryItems(Utils.NO_PARENT_PREDICATE);
categoryItemAdapter.updateData(categoryItems);
MonthlyStatistics statistics = DataHelper.getDataHelper(activity).getMonthlyStatistics(Utils.getCurrentDate(PAY));
statBuilder.populateStatistics(statistics.getStatistics().get(category));
if (action == ADD_ITEM)
{
activity.moveToMainPage();
categoryItemAdapter.notifyDataSetChanged();
}
if (action == DELETE_ITEM)
{
categoryItemAdapter.notifyItemRemoved(4);
categoryItemAdapter.notifyItemRangeChanged(4, 1);
}
}
Метод updateData
public void updateData(List<Category> categoryItems) {
this.categoryItems.clear();
this.categoryItems.addAll(categoryItems);
this.parentsAndChildren.clear();
this.parentsAndChildren.putAll(getChildrenAndParents(categoryItems));
}
В режиме отладки onBindViewHolder может видеть, что осталось только 4 правильных элемента
После того, как все закончилось, вот результат:
Если я удалю 3-й элемент (не последний), результат будет выглядеть так:
Я облазил весь интернет и не нашел решения, поэтому надеюсь, что публикация здесь поможет. Ценю все ответы. Спасибо.
РЕДАКТИРОВАТЬ: Как предложил Камаль Наян, если снова создать адаптер и поместить его в recyclerView, это сработает, но я почти уверен, что есть лучшее решение, и был бы признателен, если кто-нибудь его найдет.