[英]How to make the RecyclerView's ItemTouchHelper work on only part of the list(drag & drop)
I use RecyclerView's ItemTouchHelper to change the order(drag & drop),And I want to move only a part of the list.我使用 RecyclerView 的 ItemTouchHelper 来更改顺序(拖放),并且我只想移动列表的一部分。 I don't want to move after a certain index.
我不想在某个索引之后移动。 How can I handle it with one RecyclerView?
如何使用一个 RecyclerView 处理它?
If I explain a little more about what I want to make, The active items are sorted up and the non-active items are sorted down.如果我对我想要制作的内容进行更多解释,则将活动项目排序,将非活动项目排序。 And only the activated items will shift the order.
只有激活的项目才会改变顺序。 Right now, when I drag an active item, it goes down to the area of the non-active item, but I want to prevent it from going down.
现在,当我拖动一个活动项目时,它会下降到非活动项目的区域,但我想防止它下降。 How can I do it?
我该怎么做?
UPDATE更新
open class SimpleItemTouchHelperCallback(private val mAdapter: ItemTouchHelperAdapter) :
ItemTouchHelper.Callback() {
private var isLongPressDrag = true
fun setLongPressDragEnable(isLongPressDrag: Boolean) {
this.isLongPressDrag = isLongPressDrag
}
override fun isLongPressDragEnabled() = isLongPressDrag
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
val swipeFlags = 0
return makeMovementFlags(dragFlags, swipeFlags)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return mAdapter.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, i: Int) {
mAdapter.onItemDismiss(viewHolder.adapterPosition)
}
}
Use ItemTouchHelper.SimpleCallback
and override getDragDirs
and onMove
methods:使用
ItemTouchHelper.SimpleCallback
并覆盖getDragDirs
和onMove
方法:
ItemTouchHelper.SimpleCallback(
UP or DOWN,
0
) {
override fun getDragDirs(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
val selectedPosition = viewHolder.adapterPosition
val isActive: Boolean = // retrieve your model from list and check its active state
return if (isActive) super.getDragDirs(recyclerView, viewHolder) else 0
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder,
): Boolean {
val toPosition = target.adapterPosition
val isActiveTarget: Boolean = // retrieve your target model from list and check its active state
if (!isActiveTarget) return false
val fromPosition = viewHolder.adapterPosition
moveItem(fromPosition, toPosition)
return true
}
}
Returning 0
on getDragDirs
prevents inactive item selection , while returning false
on onMove
prevents item movement while dragging .在
getDragDirs
上返回0
可防止不活动的项目选择,而在onMove
上返回false
可防止项目在拖动时移动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.