【问题标题】:RecyclerView with swipe action menu带有滑动操作菜单的 RecyclerView
【发布时间】:2019-06-10 19:16:11
【问题描述】:

我有一个带有 ItemTouchHelper 实现的 RecyclerView。我正在使用 ItemTouchHelper 对 RecyclerView 中的项目进行拖动和排序。

我还在不同的滑动方向上执行不同的操作。如果用户从左到右(滑动)我只是停用项目的状态。如果他执行从右到左的滑动,我会激活相关项目。

我想要的: 但是现在发生了变化,我想要的是在执行左右滑动后需要显示一些图标。然后通过单击这些图标/按钮,我想执行操作。

问题: 问题是我告诉过你我已经实现了 ItemTouchHelper,然后我是如何执行我想要的(如上所述)

如何解决这个问题?我见过很多库,但它们都有局限性,因为该应用程序有很多事情要做,并且在我们的应用程序中使用了更多的 RecyclerView 实现,所以我真的不想为此冒险其余的实现。 .

更新 1: 为了更清楚我的问题,我将添加更多内容。现在我的实现类似于this。但这不是我想要的。我想为任何类型的滑动显示滑动菜单我的意思是它是向左还是向右我想在项目的左侧和右侧显示一些图标

您可以以 iOS 滑动菜单为例(参见here)。我想要在android中完全相同的行为。

【问题讨论】:

  • 如果我理解正确我建议你使用github.com/chthai64/SwipeRevealLayout
  • @AlexeiArtsimovich 这个库一次只有一个方向
  • 在没有库的情况下添加滑动并不难
  • @ManojPerumarath 请给我一些例子
  • @ManojPerumarath 添加滑动并不难,正如 OP 所述,但添加带有停止和动画的滑动是另一回事,因为 ItemTouchHelper 及其衍生工具(以及大多数库)直接处理 Canvas。

标签: java android


【解决方案1】:

你问的是不可能的:建议一个不存在的库(正如你已经发现的那样)。

您还要求人们为您仅简要描述的问题找到解决方案。您没有提供任何代码,也没有在尝试提出解决方案时遇到任何特定问题;你基本上是在期待魔法发生。

你怎样才能让它变得更好?

提供如下内容:“我正在尝试为回收站视图的行实施滑动解决方案;当我尝试执行 YYYY 时,反而发生了。这是我做的一段代码,计算如下,我是否遗漏了什么?”

不管怎样……

您声称已经在使用 ItemTouchHelper,因此,如果您查看 how a very basic one works,您会注意到该助手最终将通过以下方式直接在画布上绘制:

   @Override
   public void onChildDraw(
            final Canvas canvas,
            final RecyclerView recyclerView,
            final RecyclerView.ViewHolder viewHolder,
            final float deltaX,
            final float deltaY,
            final int actionState,
            final boolean isCurrentlyActive) {

这源自平台ItemTouchHelper.SimpleCallback。所以……

如果你想实现你的解决方案,你需要在那里实现它来做一些事情,比如停止拖动、绘制内容(图标)等。

这不是一个简单的解决方案,而且把整个事情都做好是很困难的;如果您介绍“RecyclerView 上的更多实现”,则更是如此。

我希望这个答案能够为您指明正确的方向,并且您的下一个相关问题更多是关于您尝试(但失败)做的事情,而不是“请为我做这件事”的场景。 (如果您的意图不是这些,请道歉,但您花了 5 分钟输入此问题,并且需要数小时/数天来实施此问题,所以这次请设定您的期望)。

最后,当我写this 时,我意识到大多数人都想要 iOS 滑动行为;不幸的是,上述行为并未在 Android 上预先实现(如在 iOS 上),您必须自己处理;在 Android 上完成这项任务并非不可能,也不是世界上最困难的任务,但如果你对 RecyclerView 进行过多破解,你会感到头疼。

更新

您现在已经意识到,ItemTouchHelper 有问题。它直接在 Canvas 上绘制,因此它不知道 Layout、View、Margin 等。这些都是在触摸助手领域之外的东西。助手被赋予了一个画布和绘图功能,仅此而已。

这个画布尺寸从何而来? 好吧,它是在 RecyclerView 及其视图的布局/测量过程中计算的。

然后我如何停止拖动“正好在屏幕的中心”?

将值传递给您的助手;请记住,计算屏幕中间位置的责任不在 TouchHelper 的合同中;但是您的 Activity/Fragment 确实知道这一点。提供 Touch Helper 执行您希望它执行的操作所需的信息。

“返回”到原始位置,意味着知道初始状态是什么等。所有这些信息都由 RecyclerView 及其他位置知道,而不是 TouchHelper。

所以你需要测量你的布局,保存一些值,将它们传递给 touchhelper 以便它可以操作,等等。

如您所见,整体情况开始变得越来越复杂。我给你的建议是:

  1. 尝试将此功能推出,因为“平台不这样做需要时间,不值得”(滑动操作的价值和可发现性充其量是值得怀疑的,但现在它是一种无处不在的操作,所以你可能有无论如何都要这样做)。
  2. 如果您真的必须这样做,请尽可能多地抽象事物,创建您认为可能需要的所有类/接口,即使您最终会得到“MiddleScreenCalculatorDelegate”之类的东西。稍后修复会更容易,但至少让每个组件做一小部分事情。

最后,您的项目触摸助手必须计算视图已经滑动了多少偏移量(增量),并在达到已知阈值时停止。

祝你好运:)

p.s.:我建议您针对特定问题发布一个不同的问题以获得更好的帮助,这个答案是非常无用的。 :)

【讨论】:

  • 你是对的,兄弟。你已经暗示使用 onChildDraw 来完成我想要的。而我正在考虑隐藏布局下方的图标,并通过在我想要移动的布局上使用 onTouchListener 来向左/向右移动主布局。通过这种方式,我可以在左侧和右侧显示图标。 , 这个怎么样??
  • 如果我使用 OnChildDraw,我将如何在屏幕的确切一半处停止移动,以及如何将其恢复到原始位置。您给出的 iOS 示例与我想要的行为完全相同
  • 查看更新的答案;不幸的是,这是我能做到的。 :) 祝你好运!
  • 好的,我正在考虑使用 TouchListener。你怎么看?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
相关资源
最近更新 更多