提问者:小点点

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


我已经显示了一个列表的项目与回收站视图,我有不同类型的项目(标题和项目),如下所示

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,但不会阻止我进入有什么建议吗?


共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