![](/img/trans.png)
[英]RecyclerView scrolls to top when dragging item with 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-b9456d2b1aaf和https://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.