【发布时间】:2021-07-17 08:16:21
【问题描述】:
我对 recyclerView(使用 GridLayoutManager)有一个奇怪的情况。 当我删除一个项目并使用 (notifyItemRemoved 和 notifyItemRangeChanged/notifyDataSetChanged) 刷新它时,它不会删除该项目,而是将其标记为删除(它有点灰显)。如果该项目不是最后一个,那么它有点被删除,但不是真的 - 它就在其他项目下并且不可见(如果我向这个项目添加额外的视图 - 你可以看到它在那里),但如果它是最后一个你可以看到它是灰色的。
这不是我第一次使用recyclerView,我之前也没有遇到过,但它是第一次使用GridLayoutManager,所以这可能是原因。
我已经调试过代码,刷新后重新创建recyclerView时,删除onBindViewHolder中的第5个后,可以清楚地看到List of items包含正确的项目(4)。
这里是当一个标记的图标被点击时的删除功能,它会得到一个 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 个项目
完成后就是这样的结果:
如果我删除第三项(不是最后一项),结果如下所示:
我已经搜索了所有互联网,但找不到解决方案,所以我希望在这里发布对您有所帮助。 欣赏所有答案。 谢谢。
编辑: 正如 Kamal Nayan 建议的那样,如果再次创建适配器并将其放入 recyclerView 确实有效,但我很确定有更好的解决方案,如果有人能找到它,我将不胜感激。
【问题讨论】:
-
尝试重新设置适配器?
-
@KamalNayan 我一直在避免这个解决方案,但是是的,再次设置适配器是可行的,但我很确定这不是正确的做法,因为我们确实有所有的通知方法要做只是。不过感谢您的建议。
-
如果您想为此分享一个演示,我们可以彻底了解一下,因为这是一种奇怪的行为
-
@Zain 这几乎是一个带有屏幕截图的演示。屏幕截图的顺序正确。单击某个图标后,将出现删除消息。通过点击DELETE按钮,你看到的结果..
标签: android android-recyclerview gridlayoutmanager