防止滑动以删除 recyclerview 项目

Prevent swipe to delete recyclerview item

我想捕捉水平方向的垂直滑动 RecyclerView。每个项目只是一个 CircleImageView.
我在 Internet 上找到了很多资源(例如 Drag and swipe with RecyclerView, ),但这些解决方案最终删除了该项目。我不知道滑动 是否也要求删除该项目。
我想要实现的是 捕捉 RecyclerView 中某个项目的滑动动作,但 不从 [=10= 中删除项目本身 ].
我认为重写方法 onChildDraw() 是个好主意,就像这里建议的那样:,但我不明白如何实现我想要的行为。
我的想法是:当用户滑动某个项目时,该项目本身会朝那个方向移动;当用户结束触摸事件时,该项目必须回到原来的位置(可能会改变背景颜色)。

编辑 1: 可能会有所帮助,但它无法实现我需要的行为。该项目必须回到原来的位置

您的 RecyclerView 附有 RecyclerView.Adapter。适配器确定 RecyclerView 可以看到和显示哪些信息。因此,如果 100 项后备数组(由您管理)中的第 10 项被刷过,适配器可以报告该数组现在包含 99 个项目并且永远不会将刷过的项目呈现给 RecyclerView。这样,该项目似乎已被删除,但在内部得到维护,并且仍然可以通过编程方式访问。如何管理该内部状态取决于您并取决于您的实施。


但是,如果您不想从屏幕上删除项目而只是更改其外观,我认为您需要查看实际删除项目并通知适配器的方法 onItemDismiss数据变化。

public void onItemDismiss(int position) {
    mItems.remove(position);
    notifyItemRemoved(position);
}

您可以在此处进行更改。该项目将留在适配器中。您还需要将该位置标记为 "swiped" 以防视图持有者被回收,以便您可以保持视觉 "swiped" 状态。

public void onItemDismiss(int position) {
    // Change background color, etc.
}

查看具有 "swipe to delete" 函数和 "undo" 的代码以获得一些想法。 Here 是一个对话框的示例,如果单击 "Cancel",则在删除实际发生之前调用该对话框。 "undo" 的其他示例还有很多。您正在尝试做的事情可以被认为是直接和隐含的 "undo",对背景进行视觉更改。

如果您想让项目在滑动后移回原位,以下方法应该有效:

public void onItemDismiss(int position) {
    notifyItemChanged(position);
}