android限制在范围itemtouchhelper中拖动项目



我用RecyclerView显示了一个项目列表,我有不同类型的项目(标题和项目(,比如下面的

Header 1
Item 1
Item 2
Header 2
Item 3
Item 4 
Item 5
Item 6
Header 3
Item 7
....

我想限制交换项目在其部分标题中的位置。例如,项目4可以与项目3、项目5和项目6交换,但不能超出其部分边界。我使用ItemTouchHelper来实现这里建议的拖动时交换机制https://medium.com/@ipaulpro/拖放-带再循环-b9456d2b1af和https://medium.com/@ipaulpro/拖放-带回收装置-6a6f0c422efd我重载了canDropOver方法,如果您想交换例如Item 4和Header 2,这会有所帮助,但不会阻止我将Item拖到Header 1。有什么建议吗?

一旦设置了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

最新更新