Android 事件分发 系列文章目录

【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 )
【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )

【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 )
【Android 事件分发】ItemTouchHelper 实现侧滑删除 ( 设置滑动方向 | 启用滑动操作 | 滑动距离判定 | 滑动速度判定 | 设置动画时间 | 设置侧滑触发操作 )
【Android 事件分发】ItemTouchHelper 实现拖动排序 ( 设置滑动方向 | 启启用长按拖动功能 | 拖动距离判定 | 设置拖动触发操作 )


文章目录

  • Android 事件分发 系列文章目录
  • 一、ItemTouchHandler 简介
  • 二、ItemTouchHelper.Callback 自定义实现
    • 1、设置移动标志 ( 拖动/滑动 )
  • 三、完整代码实现
    • 1、主界面
    • 2、ItemTouchHelper.Callback 回调类
  • 四、博客资源

一、ItemTouchHandler 简介


ItemTouchHandler 是 Google 提供的一个工具类 , 主要针对 RecyclerView 的上下左右拖动事件 进行处理 ;

如 : 侧滑删除 功能 , 条目位置拖动交换 功能 , 就可以使用 ItemTouchHandler 实现 ;

如果 RecyclerView 没有添加 ItemTouchHandler , 只能上下滚动 , 左右拉动 , 没有效果 , 也无法进行拖动交换条目操作 ;

调用 ItemTouchHandler 的 attachToRecyclerView 方法 , 传入想要添加上下左右拖动事件的 RecyclerView 对象 , 即可为该 RecyclerView 添加拖动事件 ;

添加后 , 该 RecyclerView 自动可以进行上下左右拖动操作 , 用户可以自行添加相关的回调 ItemTouchHelper.Callback , 响应这些事件 ;

初始化 RecyclerView 并设置 ItemTouchHelper 示例 :

        //1 . 从布局中获取 RecyclerViewrecycler_view = findViewById(R.id.recycler_view);//2 . 创建并设置布局管理器//创建布局管理器layoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);//设置布局管理器recycler_view.setLayoutManager(layoutManager);// 设置边距recycler_view.addItemDecoration(new ItemDecoration());//3 . 创建并设置列表适配器adapter = new Adapter();recycler_view.setAdapter(adapter);//4. 添加拖动事件Callback callback = new Callback();mItemTouchHelper = new ItemTouchHelper(callback);mItemTouchHelper.attachToRecyclerView(recycler_view);

效果展示 : 此时还没有加入上下左右 拖动/滑动 操作 ;

二、ItemTouchHelper.Callback 自定义实现


其中的 ItemTouchHelper.Callback 一般都需要开发者自定义子类实现 ;

1、设置移动标志 ( 拖动/滑动 )

重写 ItemTouchHelper.Callback 的 getMovementFlags 方法 ;

该方法用于设置上下左右动作 , 只有在此处打开了指定方向的设置 , 才可以应用具体方向的拖动 , 动作有两种 , 一种是滑动 , 如左右侧滑 ; 一种是拖动 , 长按后激活拖动操作 , 可用于拖动交换位置操作 ;

拖动 / 滑动 标志位可以使用 ItemTouchHelper.UP | ItemTouchHelper.DOWN , 或运算得到想要的标志位 ;

将或运算结果传入 makeMovementFlags 方法 , 第一个参数是设置拖动标志位 , 第二个参数是设置滑动标志位 ;

设置 左右滑动 , 上下拖动代码如下 :

    /*** 设置上下左右动作* 只有在此处打开了指定方向的设置 , 才可以应用具体方向的拖动* @param recyclerView* @param viewHolder* @return*/@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {/*设置拖动方向, 此处设置上下拖动事件*/int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;/*设置滑动方向, 此处设置左右侧滑事件*/int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;// 应用 拖动 和 滑动 设置return makeMovementFlags(dragFlags, swipeFlags);}

效果展示 :

三、完整代码实现


1、主界面

package kim.hsl.recyclerview;import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {/*** 数据源*/private ArrayList<String> names = new ArrayList<String>();/*** 当前的 RecyclerView 列表*/private RecyclerView recycler_view;/*** 布局管理器*/private LinearLayoutManager layoutManager;/*** 适配器*/private Adapter adapter;/*** 添加拖动处理*/private ItemTouchHelper mItemTouchHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化数据initData();//1 . 从布局中获取 RecyclerViewrecycler_view = findViewById(R.id.recycler_view);//2 . 创建并设置布局管理器//创建布局管理器layoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);//设置布局管理器recycler_view.setLayoutManager(layoutManager);// 设置边距recycler_view.addItemDecoration(new ItemDecoration());//3 . 创建并设置列表适配器adapter = new Adapter();recycler_view.setAdapter(adapter);//4. 添加拖动事件Callback callback = new Callback();mItemTouchHelper = new ItemTouchHelper(callback);//mItemTouchHelper.attachToRecyclerView(recycler_view);}/*** 初始化数据*/private void initData(){names.add("宋江");names.add("卢俊义");names.add("吴用");names.add("公孙胜");names.add("关胜");names.add("林冲");names.add("秦明");names.add("呼延灼");names.add("花荣");names.add("柴进");names.add("李应");names.add("朱仝");names.add("鲁智深");names.add("武松");names.add("董平");names.add("张清");names.add("杨志");names.add("徐宁");names.add("索超");}/*** RecyclerView 适配器*/public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View root_view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recyclerview, parent, false);return new ViewHolder(root_view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.text.setText("" + names.get(position));}@Overridepublic int getItemCount() {return names.size();}public class ViewHolder extends RecyclerView.ViewHolder {TextView text;public ViewHolder(@NonNull View itemView) {super(itemView);text = itemView.findViewById(R.id.text);}}}}

2、ItemTouchHelper.Callback 回调类

package kim.hsl.recyclerview;import android.graphics.Canvas;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;public class Callback extends ItemTouchHelper.Callback {@Overridepublic boolean isLongPressDragEnabled() {return super.isLongPressDragEnabled();}@Overridepublic boolean isItemViewSwipeEnabled() {return super.isItemViewSwipeEnabled();}@Overridepublic void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {super.onSelectedChanged(viewHolder, actionState);}@Overridepublic void onMoved(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, int fromPos, @NonNull RecyclerView.ViewHolder target, int toPos, int x, int y) {super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);}/*** 设置上下左右动作* 只有在此处打开了指定方向的设置 , 才可以应用具体方向的拖动* @param recyclerView* @param viewHolder* @return*/@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {/*设置拖动方向, 此处设置上下拖动事件*/int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;/*设置滑动方向, 此处设置左右侧滑事件*/int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;// 应用 拖动 和 滑动 设置return makeMovementFlags(dragFlags, swipeFlags);}@Overridepublic boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {return false;}@Overridepublic void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {}@Overridepublic void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);}@Overridepublic void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);}
}

四、博客资源


博客资源 :

  • GitHub 地址 : https://github.com/han1202012/001_RecyclerView

【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 )相关推荐

  1. 【Android View事件分发机制】关于拦截事件的注意点

    在父容器拦截事件时,为什么不能拦截DOWN事件呢? 先看看源码: 回顾一下事件分发机制原理,当事件来了之后,如果父容器不拦截,则会询问其child view ,当某child view 有事件需求,父 ...

  2. Android进阶七:RecyclerView拖动滑动之ItemTouchHelper

    ItemTouchHelper ItemTouchHelper是一个强大的工具,它处理好了关于在RecyclerView上添加拖动排序与滑动删除的所有事情. 它是RecyclerView.ItemDe ...

  3. Android 自定义ViewPager设置屏蔽左右滑动事件

    只要有欲望,就应该有奋斗的心.... 屏蔽左右滑动事件的viewPager public class CustomNoScrollViewPager extends ViewPager{private ...

  4. Android 7.1 增加屏幕边缘滑动事件(手势滑动)两种方式(Back,Home,Menu功能键) 免开启无障碍功能

    目前公司在做新项目开发,项目目前是不让有Back,Home,Menu实体按键,这就导致了一个问题,点开其它应用无法返回到桌面, 当然些问题对于做开发的我们肯定是难不到的,如果我们开发碰到这问题肯定是a ...

  5. android 解决ListView点击与滑动事件冲突

    如果你的ListView的Item有滑动功能,但又点击Item跳转到其它activity,这样若是在Adapter里面写点击事件是会导致滑动事件获取不到焦点而失效: 解决方法:不要在adapter里面 ...

  6. (十三)事件分发器——event()函数,事件过滤

    事件分发器--event()函数 事件过滤 事件进入窗口之前被拦截 eventFilter #include "mywidget.h" #include "ui_mywi ...

  7. 【Android 事件分发】ItemTouchHelper 实现拖动排序

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  8. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  9. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

最新文章

  1. Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity
  2. 刚刚字节跳动发布了1200个java岗位,平均薪资40k
  3. matlab 粘连分割代码,【求助】图像中粘连字符切分代码,求注释!!!
  4. 归并排序--Java
  5. python画图y轴在右侧_Matplotlib:图形左边缘和Y轴之间的固定间距
  6. Halcon数据类型
  7. loss值多少才算收敛_你了解TDS值是多少才是合格的吗?
  8. python创建字符串_Python基础之字符串
  9. Android File存储
  10. 如何将PDF转换成可以直接编辑的CAD图纸
  11. python正则表达式提取c语言中的函数,Python正则表达式匹配C语言函数
  12. 黑莓手机用desktop manager安装了一些软件后重启出现erro523无法进入桌面
  13. 太戈编程DEVC++教师答案库
  14. Java转Ruby【快速入门】
  15. 神经元在人体内如何分布,人体神经元怎么分布的
  16. 用分治法解决青蛙跳问题(斐波那契数列)
  17. 定积分的基本性质4 绝对可积性
  18. 中间件系列——EMQX 的集群搭建
  19. 被忽视的钣金零件外观设计
  20. 短视频抖音账号矩阵seo优化系统技术代开发

热门文章

  1. CentOS6.3 下启动Oracle service和listener
  2. 使用PostSharp开始AOP
  3. C# WebBrowser document.execCommand()解析
  4. 发布Apworks应用开发框架(Alpha版本)
  5. 使用函数PIVOT现实数据行转列
  6. PHP安装memcache扩展
  7. themeleaf跳转锚链接
  8. JSON返回DateTime/Date('123123123')/解决办法
  9. lucene 自定义评分
  10. 集群搭建SSH的作用及这些命令的含义