拖拽移动RecyclerView
Posted xiaohuanqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拖拽移动RecyclerView相关的知识,希望对你有一定的参考价值。
博客移动到个人站点:http://www.wangchengmeng.club/2018/02/01/%E6%8B%96%E6%8B%BD%E7%A7%BB%E5%8A%A8RecyclerView/
欢迎来吐槽
自由拖拽的List和Grid(ps:样子有点丑,但是功能很需要)。
ItemTouchHelper,对,就是它。
1.定一个callback类,并实现ItemTouchHelper.Callback,处理移动拖拽:
构造函数:传入数据载体adapter,方便拖拽时对数据的处理
private MainCouponAdapter mMainCouponAdapter;
public ItemTouchHelperCallback2(MainCouponAdapter adapter)
mMainCouponAdapter = adapter;
/**
* isLongPressDragEnabled返回的是一个boolean值
* ,当boolean值为true时,
* 下面的makeMovementFlags方法的dragFlags值才会起效,
* 它具有上下拖动作用,返回false时则没有任何效果。
*/
@Override
public boolean isLongPressDragEnabled()
//长按拖动
return true;
/**
* isItemViewSwipeEnabled返回的也是一个boolean值
* 它和isLongPressDragEnabled类似。不同的是它控制的是左右滑动效果。
*/
@Override
public boolean isItemViewSwipeEnabled()
return true;
/**
* getMovementFlags方法返回的是一个int值,这个int值主要是makeMovementFlags(int
* dragFlags, int swipeFlags)方法返回的int值,其中makeMovementFlags需要传递两个参数dragFlags和swipeFlags。
* dragFlags和swipeFlags是通过下面几种方式结合
* <p>
* ItemTouchHelper.UP | ItemTouchHelper.DOWN
* ItemTouchHelper.START | ItemTouchHelper.END
* ItemTouchHelper.UP | ItemTouchHelper.DOWN|ItemTouchHelper.START | ItemTouchHelper.END
* <p>
* 如果我们不需要其中一个方向的效果,那么参数直接传0值就行了。
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
int dragFlags;
int swipeFlags = 0;
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager)
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.START | ItemTouchHelper.END;
else
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
/**
* onMove方法,主要是拖动的时候,可以在这里监听进行数据更新的操作
* onSwiped方法,主要是相邻的item进行数据交换的数据更新。
* onSelectedChanged和clearView主要是长按操作对象可以进行一些操作,比如放大缩小操作。
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
// if (viewHolder.getAdapterPosition() == 0)
// 第一个item可以拖动但是位置不变
// return false;
//
mMainCouponAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction)
mMainCouponAdapter.onItemDismiss(viewHolder.getAdapterPosition());//自己adapter中实现该方法并自定义数据处理
2.定义接口 ItemTouchHelperAdapter并声明两方法,
//处理滑动消失item
public void onItemDismiss(int position);
//处理拖拽移动的item
public void onItemMove(int from, int to);
3.定义数据载体adapter类并实现ItemTouchHelperAdapter接口
主要代码:实现接口方法
@Override
public void onItemDismiss(int position)
//滑动删除
mStringList.remove(position);
Toast.makeText(mActivity, "删除了", Toast.LENGTH_SHORT).show();
notifyItemRemoved(position);
//mStringList数据载体list
@Override
public void onItemMove(int from, int to)
//移动
Collections.swap(mStringList, from, to);
notifyItemMoved(from, to);
不改变RecyclerView以及adapter任何写法,只需要添加以下代码:
ItemTouchHelperCallback2 callback =
new ItemTouchHelperCallback2(mainCouponAdapter);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(mRecyclerView);
以上是关于拖拽移动RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章
notifyItemMoved实现recyclerView拖拽动画
RecyclerView侧滑菜单,滑动删除,长按拖拽,下拉刷新上拉加载