在 RecyclerView 中的特定位置拖放停止

Posted

技术标签:

【中文标题】在 RecyclerView 中的特定位置拖放停止【英文标题】:Drag Drop halt for Specific Position in RecyclerView 【发布时间】:2019-06-10 09:48:27 【问题描述】:

有没有什么方法可以使用 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)

【问题讨论】:

【参考方案1】:

最后,经过对 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)
    

【讨论】:

以上是关于在 RecyclerView 中的特定位置拖放停止的主要内容,如果未能解决你的问题,请参考以下文章

拖放 RecyclerView 的第一项会移动几个随机位置

在 Recyclerview 之外拖放视图

为啥 Qt 中的拖放停止工作?

RecyclerView 拖放喜欢 - 文件和文件夹

RecyclerView - 获取特定位置的视图

在ANDROID中相互拖放时合并Recyclerview中的项目?