【问题标题】:Android - RecyclerView drag using ItemTouchHelper.CallbackAndroid - RecyclerView 使用 ItemTouchHelper.Callback 拖动
【发布时间】:2016-10-14 14:18:10
【问题描述】:

我目前正在开发一个小型 Android 模块,我遇到了一个也许有人可以解决的问题。我需要创建一个日历并允许用户通过以下方式选择一个日期范围:1)单击开始日期(这将默认创建 2 天范围),然后 2)触摸一个范围边界并拖动它以增加或减小该范围

目前,我使用 RecyclerView 和 GridLayoutManager 创建了所有日历日单元格,该单元格有很多行(所有周),每行 7 个项目(天)。然后我使用了 RecyclerView ItemTouchHelper (https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.html) 和 ItemTouchHelper.Callback (https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html) 完成拖放功能。我的方法是使用那些助手提供的拖放检测(看看https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf#.ib8r012gc)对其进行修改以避免移动一个项目而只检测我想要的触摸+拖放手势。我已经通过删除默认拖动动画(覆盖 ItemTouchHelper onDraw/onDrawOver)并使用 ItemTouchHelper.Callback 回调来管理拖动移动(不交换适配器项,因为我需要它们始终在同一位置)正确地完成了该功能。一切正常,但我现在遇到了一个问题,因为拖动检测没有按预期工作。我将尝试解释它:如果我在给定单元格的中心开始拖动移动,然后移动到其左侧的单元格,则在到达中心之前不会触发拖动移动(与我开始拖动移动的位置相同)的左侧单元格。这是一个问题,因为我需要在到达另一个单元格时立即检测到拖动(如果手指在新的单元格边界内,则应该触发拖动)。另一个例子是:如果我从一个单元格的最左边开始拖动,直到到达另一个单元格的最左边时才会触发拖动。

现在我正在尝试使用 ItemTouchHelper.Callback.chooseDropTarget 方法在手指进入新单元格时手动选择放置目标,但我无法获得这行得通。我认为(但我无法确保)接收到的 x,y 坐标有些奇怪。

我知道一些代码示例会很有帮助,但我无法粘贴它,因为它属于受保护的私有存储库:(

任何人都可以向我提供任何帮助,我们将不胜感激。而且,当然,我会尽量等待这个话题,以提供我能提供的所有信息。我还将考虑新的不同方法和建议来获得我需要移动范围边界的“触摸+移动+向上”运动 :)

非常感谢所有 Stack Overflow 社区!

【问题讨论】:

  • 看看这个:medium.com/@ipaulpro/…
  • 谢谢@XxGoliathusxX。我已经检查了您的链接,但我仍然遇到同样的问题;)当我开始开发此功能时,我已经关注了该链接和其他一些链接。

标签: android drag-and-drop android-recyclerview gridlayoutmanager itemtouchhelper


【解决方案1】:

经过更多研究,我找到了解决问题的方法。我会发布它,所以如果有人遇到同样的问题,他可以在这里找到一些帮助:)

我的问题是我使用ItemTouchHelper.Callback.chooseDropTargethttps://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html#chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder,%20java.util.List%3Candroid.support.v7.widget.RecyclerView.ViewHolder%3E,%20int,%20int))返回的curXcurY参数,好像它们是拖动时的当前手指坐标,但它们是最左上角坐标的坐标应用任何翻译后的拖动视图。现在我觉得有点傻。我应该更好地阅读文档:|

由于我不需要最左上角的坐标而是手指位置,我的解决方案是使用附加到源视图的触摸侦听器,这样我就可以使用touchSrcX = MotionEvent.getX()touchSrcY = MotionEvent.getY() 方法,然后我在 chooseDropTarget 回调中选择目标之前应用了点转换。我的意思是,类似: curX += touchSrcX curY += touchSrcY

如果有人需要更多详细信息或更好的解释,请与我联系,我很乐意为您提供帮助! :)

【讨论】:

  • 如何使用ItemTouchHelper.Callback.onChildDraw dX dY 和ViewHolder 的原始x 和y 坐标?
猜你喜欢
  • 2021-05-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多