Android的ItemTouchHelper:如何操作触摸视图?

3
在支持库recyclerview-v7的22.2版本中,Google引入了ItemTouchHelper,以便于拖放和滑动项目。
在我的RecyclerView中,我想仅在适配器项的一个View/部分上启用这些功能,而不是整个项。是否有一种方法可以将ItemTouchHelper的范围限制为特定目标?或者当调用ItemTouchHelper.onMoved()ItemTouchHelper.onSwiped()时,获取触摸的View以便能够在那里过滤允许的Views?

你想要拖动和滑动RecyclerView项的特定子项,还是只有当触摸到该子项时才想要拖动/滑动整个项? - stan0
2个回答

1
你可以使用 ItemTouchHelper.startDrag(RecyclerView.ViewHolder) 手动开始拖动。
你的 ItemTouchHelper.Callback 应该从 isLongPressDragEnabled() 返回 false。然后你可以在你的 RecyclerView.Adapter 中创建一个 interface,让 Fragment/Activity 知道 "handle" View 上的长按事件。
要查看示例,请查看我的 ItemTouchHelper 示例项目:

https://github.com/iPaulPro/Android-ItemTouchHelper-Demo

RecyclerListAdapter拥有OnStartDragListener,它通知RecyclerListFragment开始拖动(调用startDrag())。


0

onMove方法有一个RecyclerView.ViewHolder viewHolder参数。viewHolder.itemView应该是被触摸的视图。如果它是你需要移动的视图,将其移动到目标对象并让onMove方法返回true,否则返回false

public abstract boolean onMove (RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)


Parameters
recyclerView    The RecyclerView to which ItemTouchHelper is attached to.
viewHolder  The ViewHolder which is being dragged by the user.
target  The ViewHolder over which the currently active item is being dragged.

我之前不知道ViewHolder.itemView,但它似乎是在适配器中填充的完整View,而不是被点击的子View。这是否正确? - Gaëtan
ItemTouchHelper 用于为 RecyclerView 提供完整项目移动的回调,ViewHolder.itemView 是项目的完整视图。 - random
顺便问一下,需要移动的视图的目标视图是什么? - random
View这个项目应该移动,但只有在特定部分的长按触发时才应该移动。滑动也是一样的道理。原因是其中一个子View有自己的事件,我不希望它干扰ItemTouchHelper的事件。 - Gaëtan
你应该尝试将长按监听器附加到特定部分,以触发项目移动。您打算如何检测特定部分的滑动?它足够大吗? - random

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接