我已经显示了一个列表的项目与回收站视图,我有不同类型的项目(标题和项目),如下所示
Header 1
Item 1
Item 2
Header 2
Item 3
Item 4
Item 5
Item 6
Header 3
Item 7
....
我想限制在他们的部分标题内交换项目的位置。例如,项目4可以与项目3、项目5和项目6交换,但不能超出其截面边界。我使用< code > itemctouchhelper 来实现这里建议的拖动时交换机制https://medium . com/@ ipaulpro/drag-and-swipe-with-recycle view-b 9456d 2 B1 AAF和https://medium . com/@ ipaulpro/drag-and-swipe-with-recycle view-6a 6 f0c 422 EFD我重载了< code>canDropOver方法,该方法有助于交换例如项目4和标题2,但不会阻止我进入有什么建议吗?
一旦设置了canDropOver
,当ViewHolder
被拖向相邻的ViewHolder
时,最后一个难题就是重写onChildDraw
并钳制dY
值(假设是垂直列表——如果使用水平列表,钳制dX
)。
例如:
override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
val previousViewHolder = recyclerView.findViewHolderForAdapterPosition(viewHolder.bindingAdapterPosition - 1)
val nextViewHolder = recyclerView.findViewHolderForAdapterPosition(viewHolder.bindingAdapterPosition + 1)
val isDraggingUpward = dY < 0
val isDraggingDownward = dY > 0
val isDraggingIntoUndraggableArea =
(isDraggingUpward && previousViewHolder != null && !canDropOver(recyclerView, viewHolder, previousViewHolder))
|| (isDraggingDownward && nextViewHolder != null && !canDropOver(recyclerView, viewHolder, nextViewHolder))
val newDy = if (isDraggingIntoUndraggableArea) {
0f // Clamp
} else {
dY
}
super.onChildDraw(c, recyclerView, viewHolder, dX, newDy, actionState, isCurrentlyActive)
}
我还有一个存储库,您可以参考它有一个完整的应用程序示例:https://github.com/nihk/ClampedItemTouchHelper