Android-使用ItemTouchHelper.Callback进行RecyclerView拖动

Android-使用ItemTouchHelper.Callback进行RecyclerView拖动,android,drag-and-drop,android-recyclerview,gridlayoutmanager,itemtouchhelper,Android,Drag And Drop,Android Recyclerview,Gridlayoutmanager,Itemtouchhelper,我目前正在开发一个小的Android模块,我面临一个可能有人能解决的问题。我需要创建一个日历,并允许用户选择一个日期范围,方法是:1)单击开始日期(默认情况下,这将创建一个2天的范围),然后2)触摸一个范围边框并拖动它以增加或减少该范围 目前,我已经使用带有GridLayoutManager的回收视图创建了所有日历日单元格,该视图有很多行(所有周),每行7个项目(天)。然后,我使用了RecyclerView ItemTouchHelper和ItemTouchHelper.Callback来完成拖

我目前正在开发一个小的Android模块,我面临一个可能有人能解决的问题。我需要创建一个日历,并允许用户选择一个日期范围,方法是:1)单击开始日期(默认情况下,这将创建一个2天的范围),然后2)触摸一个范围边框并拖动它以增加或减少该范围

目前,我已经使用带有GridLayoutManager的回收视图创建了所有日历日单元格,该视图有很多行(所有周),每行7个项目(天)。然后,我使用了RecyclerView ItemTouchHelper和ItemTouchHelper.Callback来完成拖放功能。我的方法是使用那些助手提供的拖放检测(查看)来修改它,以避免移动一个项目,而只检测我想要的触摸+拖放手势。通过删除默认的拖动动画(覆盖ItemTouchHelper onDraw/onDrawOver)并使用ItemTouchHelper.Callback回调来管理拖动移动(无需交换适配器项,因为我需要它们始终位于同一位置),我已正确完成了该功能。一切正常,但我现在面临一个问题,因为阻力检测没有按预期工作。我试着解释一下:如果我在给定单元格的中心开始拖动运动,然后移动到单元格的左侧,直到我到达左侧单元格的中心(与我开始拖动运动的位置相同),才会触发拖动运动。这是一个问题,因为我需要在到达另一个单元格时立即检测拖动(如果手指位于新单元格边界内,则应触发拖动)。另一个例子是:如果我在一个单元格的最左侧开始拖动运动,则在到达另一个单元格的最左侧之前不会触发拖动

现在我正在尝试使用ItemTouchHelper.Callback.chooseDropTarget方法玩一玩,以在手指进入新单元格时手动选择放置目标,但我无法使其工作。我认为(但我不能保证)接收到的x,y坐标有点奇怪

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

非常感谢任何人能为我提供的任何帮助。。当然,我会尽量在本主题之前提供我能提供的所有信息。我还将考虑新的不同方法和建议,以获得我需要移动的“触摸+移动+向上”移动。


非常感谢所有Stack Overflow社区

经过进一步的研究,我找到了解决问题的办法。我会发布它,这样如果有人面临同样的问题,他可以在这里找到一些帮助:)

我的问题是,我使用的是
ItemTouchHelper.Callback返回的
curX
curY
参数。选择DropTarget
()就像它们是拖动时的当前手指坐标一样,但它们是应用任何平移后拖动视图最左上角坐标的坐标。现在我觉得有点傻。我应该更好地阅读文档:|

由于我不需要最左上角的坐标,而是手指的位置,所以我的解决方案是使用连接到源视图的触摸监听器,这样我就可以使用
touchrcx=MotionEvent.getX()
touchrcy=MotionEvent.getY()来检测初始的触摸x,y坐标(相对于该视图)
方法,然后在
chooseDropTarget
回调中选择目标之前应用点转换。我是说,比如:

curX+=touchcx
curY+=触摸屏


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

看看这个:谢谢@XxGoliathusxX。我已经检查了你的链接,但仍然有相同的问题;)当我开始开发此功能时,我遵循了该链接和其他一些链接。使用ItemTouchHelper.Callback.OnChildraw dX dY以及ViewHolder的原始x和y坐标如何?