繁体   English   中英

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

[英]android limit item dragging in a range itemtouchhelper

我已经显示了带有 RecyclerView 的项目列表,并且我有不同类型的项目(标题和项目),如下所示

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

我想限制在其部分标题内交换项目的 position。 例如,第 4 项可以与第 3 项、第 5 项和第 6 项交换,但不能在其截面边界之外与 go 交换。 我正在使用ItemTouchHelper来实现拖动机制的交换,如此处建议的https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aafhttps://medium.com -and-swipe-with-recyclerview-6a6f0c422efd我重载了canDropOver方法,如果您想交换例如项目 4 和 Header 2 但不阻止我将项目拖到 Header 1 时会有所帮助。

一旦你设置了canDropOver ,最后一块拼图就是覆盖onChildDraw并在将ViewHolder拖向相邻的ViewHolder时钳制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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM