android - RecyclerView 中特定位置的拖放暂停

标签 android kotlin android-recyclerview drag-and-drop

是否有任何方法可以使用 RecyclerView 停止将项目拖放到特定位置。 我使用以下代码实现了拖放。

    val _ithCallback = object : ItemTouchHelper.Callback() {

    //and in your implementation of
    override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
        val fromPosition = viewHolder.adapterPosition
        val toPosition = target.adapterPosition

        // Video position
        if (fromPosition == list.size - 1 || toPosition == list.size - 1) {
            return false
        }

        if (list[fromPosition].trim().isEmpty()){
            return false
        }

        if (fromPosition < toPosition) {
            for (i in fromPosition until toPosition) {
                Collections.swap(list, i, i + 1)
            }
        } else {
            for (i in fromPosition downTo toPosition + 1) {
                Collections.swap(list, i, i - 1)
            }
        }
        adapter?.notifyItemMoved(fromPosition, toPosition)

        return true
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {

    }

    //defines the enabled move directions in each state (idle, swiping, dragging).
    override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
        return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG,
                ItemTouchHelper.DOWN or ItemTouchHelper.UP or ItemTouchHelper.START or ItemTouchHelper.END)
    }
}

像这样使用它

val ith = ItemTouchHelper(_ithCallback)
ith.attachToRecyclerView(imagesRecyclerView)

最佳答案

最后,在对 ItemTouchHelper 类进行大量研究后,我这样解决了。

我所做的是将标志设置为 ACTION_STATE_IDLE,我想在其中停止拖放。希望它能帮助像我这样的人。

以下是 Kotlin 版本。如果有人在 JAVA 中需要同样的东西,我可以转换它。

//defines the enabled move directions in each state (idle, swiping, dragging).
    override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
        // The position i want to lock/halt
        if (list[viewHolder.adapterPosition].trim().isEmpty()){
            return makeFlag(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.DOWN or ItemTouchHelper.UP)
        }
        // The position i want to lock/halt
        if (viewHolder.adapterPosition == list.size - 1){
            return makeFlag(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.DOWN or ItemTouchHelper.UP)
        }
        // else enabling ACTION_STATE_DRAG
        return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG,
                ItemTouchHelper.DOWN or ItemTouchHelper.UP or ItemTouchHelper.START or ItemTouchHelper.END)
    }

关于android - RecyclerView 中特定位置的拖放暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54214843/

相关文章:

spring-security - 解决 Kotlin 中的意外覆盖错误

android - 即使在适配器上调用 notifyDataSetChange() 后,抽屉导航 ListView 也不会更新新项目

android - Intent 和 Bundle 的简单示例

java - 如何从 sqlite 中检索列并将其存储到数组中?

java - 翻新 onFailure 在滚动无限滚动监听器时抛出 "Unexpected end of stream"消息

android - 如何将 View 设置为 recyclerview 中的最后一项

android - 如何添加 recyclerview item(s) 删除动画

android - 无法为 sqlite 数据库实例化 Activity 组件信息

android - 使用 datasnapshot 从 map 标记获取数据

java - 如何在 jna 中实现具有联合类型的结构体 sizeof()