And*_*oom 4 android drag android-recyclerview itemtouchhelper
我已经使用 RecyclerView 显示了项目列表,并且我有不同类型的项目(标题和项目),如下所示
Header 1
Item 1
Item 2
Header 2
Item 3
Item 4 
Item 5
Item 6
Header 3
Item 7
....
Run Code Online (Sandbox Code Playgroud)
我想限制交换项目在其部分标题内的位置。例如,项目 4 可以与项目 3、项目 5 和项目 6 交换,但不能超出其部分边界。我正在按照ItemTouchHelper此处的建议实现拖动机制的交换https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf和https://medium.com/@ipaulpro/drag- and-swipe-with-recyclerview-6a6f0c422efd
我重载了该canDropOver方法,如果您想交换例如项目 4 和标题 2,该方法会有所帮助,但不会阻止我将项目拖动到标题 1。有什么建议吗?
一旦你完成canDropOver设置,最后一个难题就是每当 a被拖动到相邻的它不能掉落的位置时,覆盖onChildDraw并限制该dY值(假设是一个垂直列表 -dX如果使用水平列表,则限制该值)。ViewHolderViewHolder
例如:
    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)
    }
Run Code Online (Sandbox Code Playgroud)
我还有一个存储库,您可以参考其中包含完整的应用程序示例: https: //github.com/nihk/ClampedItemTouchHelper
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1171 次  |  
        
|   最近记录:  |