Android提供了ItemTouchHelper类,使得RecyclerView能够轻易地实现滑动和拖拽,此处我们要实现上下拖拽和侧滑删除。

① 创建ItemTouchHelper.Callback类

首先创建一个继承自ItemTouchHelper.Callback的类,并重写以下方法:

  • getMovementFlags(): 设置支持的拖拽和滑动的方向,此处我们支持的拖拽方向为上下,滑动方向为从左到右和从右到左,内部通过makeMovementFlags()设置。
  • onMove(): 拖拽时回调。
  • onSwiped(): 滑动时回调。
  • onSelectedChanged(): 状态变化时回调,一共有三个状态,分别是ACTION_STATE_IDLE(空闲状态),ACTION_STATE_SWIPE(滑动状态),ACTION_STATE_DRAG(拖拽状态)。此方法中可以做一些状态变化时的处理,比如拖拽的时候修改背景色。
  • clearView()**: 用户交互结束**时回调。此方法可以做一些状态的清空,比如拖拽结束后还原背景色。
  • isLongPressDragEnabled(): 是否支持长按拖拽,默认为true。如果不想支持长按拖拽,则重写并返回false。

具体实现如下:

public class SimpleItemTouchCallback extends ItemTouchHelper.Callback {private NormalAdapter mAdapter;private List<ObjectModel> mData;public SimpleItemTouchCallback(NormalAdapter adapter, List<ObjectModel> data){mAdapter = adapter;mData = data;}//设置支持的拖拽、滑动的方向@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN; //s上下拖拽int swipeFlag = ItemTouchHelper.START | ItemTouchHelper.END; //左->右和右->左滑动return makeMovementFlags(dragFlag,swipeFlag);}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {int from = viewHolder.getAdapterPosition();int to = target.getAdapterPosition();Collections.swap(mData, from, to);mAdapter.notifyItemMoved(from, to);return true;}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {int pos = viewHolder.getAdapterPosition();mData.remove(pos);mAdapter.notifyItemRemoved(pos);}//状态改变时回调@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {super.onSelectedChanged(viewHolder, actionState);if(actionState != ItemTouchHelper.ACTION_STATE_IDLE){NormalAdapter.VH holder = (NormalAdapter.VH)viewHolder;holder.itemView.setBackgroundColor(0xffbcbcbc); //设置拖拽和侧滑时的背景色}}//拖拽或滑动完成之后调用,用来清除一些状态@Overridepublic void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {super.clearView(recyclerView, viewHolder);NormalAdapter.VH holder = (NormalAdapter.VH)viewHolder;holder.itemView.setBackgroundColor(0xffeeeeee); //背景色还原}
}

② 设置ItemTouchHelper给RecyclerView

然后通过以下代码为RecyclerView设置该滑动、拖拽功能:

ItemTouchHelper helper = new ItemTouchHelper(new SimpleItemTouchCallback(adapter, data));
helper.attachToRecyclerView(recyclerview);

触摸拖拽

前面拖拽的触发方式只有长按,如果想支持触摸Item中的某个View实现拖拽,则核心方法为helper.startDrag(holder)。首先定义接口:

interface OnStartDragListener{void startDrag(RecyclerView.ViewHolder holder);
}

然后让Activity实现该接口:

public MainActivity extends Activity implements OnStartDragListener{...public void startDrag(RecyclerView.ViewHolder holder) {mHelper.startDrag(holder);}
}

如果要对ViewHolder的text对象支持触摸拖拽,则在Adapter中的onBindViewHolder()中添加:

holder.text.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN){mListener.startDrag(holder);}return false;}
});

其中mListener是在创建Adapter时将实现OnStartDragListener接口的Activity对象作为参数传进来。

完整代码如下:

public class NormalAdapter extends RecyclerView.Adapter<NormalAdapter.VH>{private List<ObjectModel> mDatas;private OnStartDragListener mListener;public NormalAdapter(List<ObjectModel> data, OnStartDragListener listener) {this.mDatas = data;mListener = listener;}@Overridepublic void onBindViewHolder(final VH holder, int position) {ObjectModel model = mDatas.get(position);holder.title.setText(model.title);holder.number.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN){mListener.startDrag(holder);}return false;}});}@Overridepublic int getItemCount() {return mDatas.size();}@Overridepublic VH onCreateViewHolder(ViewGroup parent, int viewType) {View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_3, parent, false);return new VH(v);}public static class VH extends RecyclerView.ViewHolder{public final TextView title;public final ImageView number;public VH(View v) {super(v);title = (TextView) v.findViewById(R.id.title);number = (ImageView) v.findViewById(R.id.icon);}}
}
public class Activity3 extends AppCompatActivity implements OnStartDragListener{private RecyclerView mRv;private NormalAdapter mAdapter;private ItemTouchHelper mHelper;private List<ObjectModel> mData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_3);mRv = (RecyclerView) findViewById(R.id.rv);mRv.setLayoutManager(new LinearLayoutManager(this));mAdapter = new NormalAdapter(mData = initData(), this);mRv.setAdapter(mAdapter);mHelper = new ItemTouchHelper(new SimpleItemTouchCallback(mAdapter, mData));mHelper.attachToRecyclerView(mRv);}public ArrayList<ObjectModel> initData(){ArrayList<ObjectModel> models = new ArrayList<>();String[] titles = getResources().getStringArray(R.array.title_array);for(int i=0;i<titles.length;i++){ObjectModel model = new ObjectModel();model.number = i + 1;model.title = titles[i];models.add(model);}return models;}@Overridepublic void startDrag(RecyclerView.ViewHolder holder) {mHelper.startDrag(holder);}
}interface OnStartDragListener{void startDrag(RecyclerView.ViewHolder holder);
}

RecycleView拖拽、侧滑删除相关推荐

  1. Android开发之RecyclerView的交互动画(实现拖拽和删除)

    做RecyclerView做相关的动画效果的时候,用的最多的是v7包下的ItemTouchHelper类,这个类很强大,如有兴趣的童鞋可以自行翻看源码,接下来我带领大家实现RecyclerView相关 ...

  2. 安卓开发仿微信图片拖拽_Android 仿微信朋友圈发表图片拖拽和删除功能

    朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...

  3. Android 仿微信朋友圈发表图片拖拽和删除功能

    朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...

  4. 安卓开发仿微信图片拖拽_仿微信朋友圈发表图片拖拽和删除功能

    原标题:仿微信朋友圈发表图片拖拽和删除功能 中国联通在香港公布了上市公司2017年中期业绩.2017年上半年,公司主要业绩指标持续向好,收入稳步回升,服务收入达到人民币1,241.1亿元,同比增长3. ...

  5. 原生js实现canvas画布中绘制、移动、拖拽、删除矩形(如简易截图工具)

    功能描述 待图片上传并加载完成后,重新生成画布: 鼠标在画布区域内绘制,移动,拖拽,删除矩形(如截图工具一般): isboundary() 判断是否需要判断边界问题,默认false. 效果截图 实现代 ...

  6. 解决打开文件、文件夹、拖拽复制删除时鼠标卡顿

    1.问题描述 打开文件.文件夹.拖拽文件复制删除时,鼠标总会卡一两秒,在需要处理大量文件时非常影响工作. 2.解决过程 通过任务管理器发现windows资源管理器在进行上述操作时cpu占用会迅速拉高, ...

  7. iOS高仿微信发朋友圈,图片拖拽,删除组件

    源码地址:https://github.com/Jethuang/HDragImageView

  8. 52.qt quick-自定义LineSeries、实现箭头线、标签序号、拖拽/插入/删除

    1.示例演示 最近有个需求,需要实现一个坐标定位的功能,所以实现一个类似的demo提供给大家学习. 比如定位无人机飞行坐标都可以,只需要替换背景为地图即可. 本章效果示例如下图所示: 效果如下所示: ...

  9. el-tree 拖拽互换位置_那些我们与UI交互的动作(三·拖拽)

    交互动作的直觉形成于『人与实物』的互动中. 在物理世界:接触物体一定有感觉. 在游戏里:与物体交互一定可以看到变化. 拖拽动作 拖拽对应的真实动作就是拖拽,就是『把物体从这里拿到那里』. 多么简单直接 ...

最新文章

  1. 带调色板的位图BMP和不带调色板的BMP
  2. 如何在两个jsp页面之间传值,在另外一个页面用EL表达式获取值
  3. Go连接MySql数据库too many connections
  4. gd动态曲线 php_PHP 高级编程之多线程
  5. Educational Codeforces Round 52E(构造,快速幂)
  6. java网络通信:伪异步I/O编程(PIO)
  7. 【UnityEditor】制作一个unity ui 脚本自动生成器
  8. DELPHI利用WMI获取主板参数
  9. 手眼标定原理(眼在手上和眼在手外)
  10. 为什么我偏爱用GitHub来写书?
  11. 树莓派3B+ WiFi 无线连接及配置
  12. Windows蓝屏了,如何处理?
  13. 李白打酒加强版(dp)
  14. 从异常堆栈中还原 ProGuard 混淆过的代码
  15. java计算今天是今年的第几周_java calendar类根据当前日期时间,计算当前日期在当前月是第几周,与周跨月问题,...
  16. SimpleITK使用——4. 奇怪的问题
  17. 纯c语言编译器pelloc,大规模并行粒子模拟系统代码级优化研究和实现.pdf
  18. ElasticSearch 从入门到入土
  19. Matlab GUI 如何编写下拉菜单
  20. 【转】中国行政区域(县区级带坐标经纬度)

热门文章

  1. idea 和 maven学习
  2. 对象指针与this指针
  3. Amazon电商数据分析——数据获取
  4. ASP.NET AJAX1.0尝鲜试用:Web Service调用
  5. pygame的最小系统
  6. android p 游戏调节器,游戏调节器(Game Tuner)
  7. img 显示base64_用 PySimpleGUI 做程序(7)--显示图片
  8. java 字符串查找程序_java-如何在JAR文件中搜索字符串
  9. c语言随机产生10个30 100,c语言编写随机产生10个100~200之间整数,幷按从大到小排序...
  10. 本田da屏怎么进wince系统_本田新XR-V首试:配置提升,依然好开