RecyclerView item拖拽交换

作者: 奔跑吧李博 | 来源:发表于2022-05-29 08:52 被阅读0次

    之前在项目中自己做过recyclerView列表item交换功能,顾记录下来。

    演示效果:

    实现方式主要是围绕ItemTouchHelper类的使用,它是RecyclerView.ItemDecoration的子类。

    用法:

    private val itemTouchHelperCallBack by lazy {
        MyItemTouchHelperCallBack(adapter)
    }
            
    ItemTouchHelper(itemTouchHelperCallBack).attachToRecyclerView(recyclerView)
    

    这里需要自己实现ItemTouchHelper.Callback,当ItemTouchHelper监听到recyclerView列表发生位置变化时,通过ItemTouchHelper.Callback的三个方法回调来处理事件。

    需实现的三个方法:

        override fun getMovementFlags(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder
        ): Int {
    
        }
    
        override fun onMove(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
    
        }
    
        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
    
        }
    
    • getMovementFlags
      需返回makeMovementFlags()方法,第一个参数可设定支持拖拽的方向,比如如下;第二个参数swipeFlags表示支持滑动方向。
    ItemTouchHelper.UP or ItemTouchHelper.DOWN or
                    ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
    
    • onMove
      第二个参数表当前拖拽的viewHolder,第三个参数表示当前要挪动到的viewHolder,可获取其adapterPosition得到其位置,然后使用adapter的notifyItemMoved方法将两个位置的数据进行交换。

    • onSwiped
      当item侧滑的回调事件,这里例子没有侧滑操作。

    • isLongPressDragEnabled
      另外,可通过重写isLongPressDragEnabled方法设置是否支持长按拖拽功能。

    最后,自定义ItemTouchHelp.CallBack类全部代码:
    class MyItemTouchHelperCallBack(val adapter: AppAdapter): ItemTouchHelper.Callback() {
        private var isCanDrag = false //默认关闭拖拽功能
    
        override fun getMovementFlags(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder
        ): Int {
            return makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN or
                    ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT, 0)
        }
    
        override fun onMove(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
            var movePos = viewHolder.adapterPosition
            var targetPos = target.adapterPosition
            adapter.notifyItemMoved(movePos, targetPos)
            return true
        }
    
        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
    
        }
    
        override fun isLongPressDragEnabled(): Boolean {
            return isCanDrag
        }
    
        fun setCanDrag(isCandrag: Boolean) {
            this.isCanDrag = isCandrag
        }
    }
    

    相关文章

      网友评论

        本文标题:RecyclerView item拖拽交换

        本文链接:https://www.haomeiwen.com/subject/dpgxkrtx.html