2021-10-08 RecycleView的item实现拖拽

创建recycleView,将recycleView的item实现拖拽。

新建DefaultItemTouchHelper类,继承自ItemTouchHelper,DefaultItemTouchHelper不需要实现什么方法,它的任务就是将工作代理给Callback,然后将Callback作为参数传入。

新建DefaultItemTouchHelpCallback类。继承自ItemTouchHelper.callback()方法,这个类至少实现getMovementFlags()、onMove()、onSwiped()方法。

其中一些主要方法的作用是 :

getMovementFlags: 主要在这个方法中规定可进行拖拽的方向,可进行滑动的方向。

onMove: 主要是如果实现拖拽,进行拖拽的item,可以在这进行子view的位置的替换

onSwiped: 主要是如果实现滑动,可以在这里进行子View的位置的删除操作。

isItemViewSwipeEnabled() : 返回值是是否支持滑动

isLongPressDragEnabled : 返回值是是否支持拖拽

onSelectedChanged : 在这里更新UI,当被拖动的或者是被滑动的viewHolder改变时调用,actionState会返回当前ViewHolder的状态,有三个状态值。

* action_state_swipe : 当View刚被滑动时返回
* action_state_drag : 当View刚被拖动时返回
* action_state_idle : 当View即没被拖动也没有被滑动时或者是滑动状态还没被触发时,返回这个状态
* 在这里就可以进行拖动时候进行高亮显示,

clearView: 刚刚说在onSelectedChanged中可以进行在view改变位置时更新UI,比如说进行高亮显示等,那么在clearView中是进行UI的复原,比如进行高亮显示的取消。

主要的方法就是以上几个。

​ 但是,如果说我们直接在DefaultItemTouchHelpCallback类中将所有的方法都规定实现,本来是定义一个callback就可以了,传给ItemTouchHelper生成实例,ItemTouchHelper的作用就是RecycleView进项绑定,其余的都在callback进行处理,但是如果只是定义一个callback的话自己进行实现自己需要的拖拽,那么只能实现这一种情况,就比如我这里要实现的是左右拖拽,这样这个callback就是一个定制callback,如果遇到其他也需要进行拖拽处理的情况需要重新建个类去实现。

​ 所以这里是定义一个接口,新建个ItemTouchDelegate接口,分别空实现onMove(),onSwiped(),uiOnSwiping(),uiOnDragging(),uiOnClearView(),其中getMovementFlags()我们默认实现,让ItemTouchHelper进支持上下方向的拖动、其他行为禁止,也即能满足我们的需求。

所以创建ItemTouchDeleGate接口

import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper.*
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
/**
 本来是定义一个callback就可以了,传给ItemTouchHelper生成实例,ItemTouchHelper的作用就是与RecycleView进项绑定
 其余的都在callback进行处理,
 但是如果只是定义一个callback的话自己进行实现自己需要的拖拽,那么只能实现这一种情况,就比如我这里要实现的是左右拖拽,这样这个callback就是一个定制callback
 如果遇到其他也需要进行拖拽处理的情况需要重新建个类去实现。
 所以这里是定义一个接口,新建个ItemTouchDelegate接口,
 分别空实现onMove(),onSwiped(),uiOnSwiping(),uiOnDragging(),uiOnClearView(),
 其中getMovementFlags()我们默认实现,让ItemTouchHelper进支持上下方向的拖动、其他行为禁止,也即能满足我们的需求。
 */

interface ItemTouchDelegate {
   

    //getMovementFlags中定义是否处理拖拽事件和滑动事件,以及定义拖拽的方向和滑动的方向
    //ragFlags 是拖拽标志,swipeFlags是滑动标志,我们把swipeFlags 都设置为0,表示不处理滑动操作。
    fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Array<Int> {
   
        val layoutManager = recyclerView.layoutManager
        var swipeFlag = 0
        var dragFlag = 0
        if (layoutManager is LinearLayoutManager) {
   
            if (layoutManager.orientation == LinearLayoutManager.VERTICAL) {
   
                swipeFlag = 0   // 不允许滑动
                dragFlag = (UP or DOWN)     // 允许上下拖拽
            } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值