带有滑动操作菜单的RecyclerView

时间:2019-06-10 10:21:25

标签: java android

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

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

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

问题: 问题是,正如我告诉您的那样,我已经实现了ItemTouchHelper,然后如何执行所需的操作(如上所述)

该如何解决?我看到了很多库,但是它们都有局限性,因为该应用程序还有很多工作要做,并且我们的应用程序中还使用了RecyclerView上的更多实现,因此,我真的不想为此冒险其他的实现。

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

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

1 个答案:

答案 0 :(得分:0)

您在问不可能的事情:建议一个不存在的库(如您所知)。

您正在要求人们也为您仅简要描述的问题找到解决方案。您没有提供任何代码,也没有提供解决方案时遇到的任何特定问题;您实质上是在期待魔术的发生。

如何使它变得更好?

提供类似以下内容的内容:“我正在尝试为回收者视图的行实现滑动解决方案;当我尝试执行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的合同中;但是您的活动/片段确实知道这一点。提供Touch Helper执行所需的信息。

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

因此,您需要测量布局,保存一些值,并将其传递给touchhelper,以便其可以操作,等等。

如您所见,整个画面开始变得越来越复杂。我对您的建议是:

  1. 尝试将此功能推出,因为“平台无法完成,这将需要时间,这不值得”(轻扫操作的价值和可发现性充其量是可疑的,但如今它已无处不在,因此您可能已经无论如何都可以做到。
  2. 如果确实需要这样做,则尽可能多地抽象事物,创建您认为需要的所有类/接口,即使最终得到的是“ MiddleScreenCalculatorDelegate”类型的东西。以后修复起来会更容易,但是至少让每个组件做一小部分事情。

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

祝你好运:)

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