Android列表拖动ListView~RecyclerView

Posted 亮亮在江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android列表拖动ListView~RecyclerView相关的知识,希望对你有一定的参考价值。

最近有需求要做列表的拖动以及删除和增加业务,经过一番考量给出了效果。

 长按频道管理中的条目可以上下滑动,增加或者删除对应的频道。android列表拖动有一个强大的类就可以轻松实现了,就是ItemTouchHelper,可以很好的处理滑动删除逻辑,接下来看一下具体的业务代码。

使用 ItemTouchHelper 和 ItemTouchHelper.Callback

对于Item的手势操作分为两种:侧滑和拖动,如果需要支持这两种,那么需要给ItemTouchHelper传入一个ItemTouchHelper.Callback的子类,并把ItemTouchHelperRecyclerView关联起来,下面,我们先来介绍一下ItemTouchHelper.Callback个回调方法的含义:

控制相关

  • public boolean isLongPressDragEnabled()
    是否可以通过长按来触发拖动操作,默认返回true,如果返回false,那么可以通过startDrag(ViewHolder)方法来触发某个特定Item的拖动的机制。
  • public boolean isItemViewSwipeEnabled()
    是否可以对每个Item进行侧滑。
  • public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
    返回对于某个ViewHolder可以移动的方向,可选的值有UP/DOWN/LEFT/RIGHT/START/END。对于纵向排列的线性布局而言,如果要支持上下拖动排序,那么就要标志位中就要包含UP&DOWN,而如果需要支持左滑删除,那么标志位中就要包含LEFT

结果相关

  • public abstract boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, ViewHolder target)
    当某个被拖动的Item被从旧位置拖动到了新位置后回调,如果返回true,那么ItemTouchHelper就认为viewHolder已经被移动到了targetAdapter中的位置。
  • public abstract void onSwiped(ViewHolder viewHolder, int direction)
    当某个Item被滑动到消失时回调,direction表示滑动的方向。

状态相关

  • public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)
    Item的状态发生改变时,回调该方法,actionState的取值有ACTION_STATE_IDLE/ACTION_STATE_SWIPE/ACTION_STATE_DRAG
  • public void clearView(RecyclerView recyclerView, ViewHolder viewHolder)
    标志着用户对于某个Item的操作并且Item的动画结束,此时我们应该恢复它的状态,以保证它被重新使用的时候能正确地展现。
  • public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive)

    • Canvas:绘制RecyclerViewCanvas
    • dx, dy:偏移。
    • actionState:拖拽还是侧滑,对应ACTION_STATE_DRAGACTION_STATE_SWIPE
    • isCurrentlyActivetrue表示这个Item正在被用户所控制,false则表示它仅仅是在回到原本状态的动画过程当中。
  • public void onChildDrawOver(Canvas c, RecyclerView recyclerView, ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive)
    和上面类似,只不过它是绘制在Item之上。

最后附上项目的代码,希望对有需要的同学帮助 ,下载没有积分的可私信我发包
代码下载https://download.csdn.net/download/lou_liang/70114507https://download.csdn.net/download/lou_liang/70114507

以上是关于Android列表拖动ListView~RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

Android列表拖动ListView~RecyclerView

Android列表拖动ListView~RecyclerView

如何将Listview数据裁剪到android中的滚动位置?

通过拖动重新排序ListView的元素[重复]

vc怎么实现列表控件各项的图标拖动

在android中的“项目已编辑”的位置设置ListView显示权