【问题标题】:Prevent swipe to delete recyclerview item防止滑动删除recyclerview项目
【发布时间】:2023-11-21 12:05:01
【问题描述】:

我想在水平RecyclerView 中捕捉垂直滑动。每个项目都只是一个CircleImageView
我在互联网上找到了很多资源(如Drag and swipe with RecyclerViewAndroid - Swipe to delete RecyclerView),但这些解决方案最终会删除该项目。我不知道术语 swipe 是否也要求删除该项目。
我想要实现的是捕捉 RecyclerView 中项目的滑动操作,但不删除项目本身RecyclerView
我认为一个好主意是重写方法onChildDraw(),就像这里建议的那样:How to detect if Recyclerview item is being swiped?,但我不明白如何实现我想要的行为。
我的想法是:当用户滑动项目时,项目本身会朝那个方向移动;当用户结束触摸事件时,项目必须回到原始位置(可能会改变背景颜色)。

编辑 1: How to have swipe to delete and swipe to archive in two colours in Recyclerview Android 可能会有所帮助,但它不能实现我需要的行为。该项目必须回到原来的位置

【问题讨论】:

标签: android android-recyclerview swipe swipe-gesture


【解决方案1】:

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


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

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

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

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

查看具有“滑动删除”功能和“撤消”功能的代码以获得一些想法。 Here 是一个示例,如果单击“取消”,则会在实际发生删除之前调用一个对话框。还有许多其他可用的“撤消”示例。您正在尝试做的事情可以被认为是对背景进行视觉更改的即时且隐含的“撤消”。

如果您想让项目在滑动后移回原位,以下应该可行:

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

【讨论】:

  • 感谢您的提示。我看到适配器包含onSwped() 方法中的项目。只有在方法返回后项目才消失?我认为我应该做的是在onSwped()方法中再次在先前位置添加适配器中的项目并通知插入,但是该元素已经在适配器中..我想我无法理解这个过程!
  • @A.Wolf 我更新了答案,假设您使用的是 here 方法,将项目标记为“已刷卡”。
  • 谢谢!它比我实施的更干净。我会尽快尝试的。