禁止滑动以删除recyclerview项

时间:2018-10-12 21:07:44

标签: android android-recyclerview swipe swipe-gesture

我想在水平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可能会有所帮助,但无法实现我所需的行为。该项目必须回到原始位置

1 个答案:

答案 0 :(得分: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);
}