【问题标题】:android limit item dragging in a range itemtouchhelperandroid限制项目在范围内拖动 itemtouchhelper
【发布时间】:2020-07-07 18:48:29
【问题描述】:

我使用 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/drag-and-swipe-with-recyclerview-b9456d2b1aafhttps://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-6a6f0c422efd 我重载了 canDropOver 方法,如果您想交换项目 4 和页眉 2,这会有所帮助,但不会阻止我将项目拖到页眉 1。有什么建议吗?

【问题讨论】:

    标签: android android-recyclerview drag itemtouchhelper


    【解决方案1】:

    一旦您设置了canDropOver,最后的难题就是覆盖onChildDraw 并钳制dY 值(假设是垂直列表——如果使用水平列表,则钳制dX 值) 每当ViewHolder 被拖向相邻的ViewHolder 时,它就不会掉下来。

    例如:

        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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 2019-12-08
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多