拖拽移动RecyclerView
来源:互联网 发布:医院网络建设的新闻 编辑:程序博客网 时间:2024/05/22 02:26
自由拖拽的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时则没有任何效果。 */@Overridepublic boolean isLongPressDragEnabled() { //长按拖动 return true;} /** * isItemViewSwipeEnabled返回的也是一个boolean值 * 它和isLongPressDragEnabled类似。不同的是它控制的是左右滑动效果。 */@Overridepublic 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值就行了。 */@Overridepublic 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主要是长按操作对象可以进行一些操作,比如放大缩小操作。 */@Overridepublic 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;
}
@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { mMainCouponAdapter.onItemDismiss(viewHolder.getAdapterPosition());//自己adapter中实现该方法并自定义数据处理}
2.定义接口 ItemTouchHelperAdapter并声明两方法,
//处理滑动消失itempublic void onItemDismiss(int position);//处理拖拽移动的itempublic void onItemMove(int from, int to);
3.定义数据载体adapter类并实现ItemTouchHelperAdapter接口
主要代码:实现接口方法 @Overridepublic 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);
阅读全文
0 0
- 拖拽移动RecyclerView
- ItemTouchHelper实现RecyclerView条目拖拽移动、滑动删除
- 使用ItemTouchHelper和RecyclerView实现拖拽移动效果
- 设置RecyclerView 移动到底部
- Recyclerview拖拽和侧滑删除
- RecyclerView 简单实现拖拽和滑动
- 安卓里RecyclerView的拖拽滑动列表
- Scollerview与Recyclerview 嵌套拖拽处理
- RecyclerView的拖拽 滑动删除效果
- RecyclerView+ItemTouchHelper实现拖拽滑动
- jQuery拖拽移动
- 按钮拖拽移动
- 用RecyclerView实现移动应用中常见的列表菜单
- RecyclerView实现列表Item长按移动、左右滑动删除
- 解决瀑布流recyclerview的闪烁移动问题
- Android TV RecyclerView焦点移动飞框的实现
- RecyclerView
- RecyclerView
- 线段树板子
- Mysql插入语句value与values的区别
- shell中各种括号()、(())、[]、[[]]、{}的作用及使用场景
- 超分辨率重建之VDSR
- 【JZOJ5287】【NOIP2017提高组模拟】最短路
- 拖拽移动RecyclerView
- 《史蒂夫·乔布斯传》感悟
- jms学习-基本概念(一)
- TensorFlow 测试 IRIS 数据
- 最全oracle单行函数之转换函数用法详解
- Gradle,Groovy与Android Studio中的Gradle详解
- JAVA8 十大新特性详解
- 陀螺仪数据处理
- casper.js