ItemTouchHelper.Callback 详解

article/2025/9/17 11:36:39


ItemTouchHelper是在操作RecyclerView时,堆Item进行长按移动,左右滑动删除效果的一个辅助类,但是我们要考虑,为什么这个辅助类就可以实现移动跟左右删除Item的效果呢?我们的touch事件是怎么作用到RecyclerView的Item上呢?我们通过源码的解析都是可以知道这是为什么的。

下面开始:

创建一个ItemTouchHelper,需要传入一个继承自ItemTouchHelper.Callback
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(adapter));
itemTouchHelper.attachToRecyclerView(recyclerView);

我们先介绍下这个ItemTouchHelper.Callback这个类以及里面的方法:

这个方法用于让RecyclerView拦截向上滑动,向下滑动,想左滑动
makeMovementFlags(dragFlags, swipeFlags);dragFlags是上下方向的滑动 swipeFlags是左右方向上的滑动
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {return makeMovementFlags(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.LEFT);
}

/**
 * drag状态下,在canDropOver()返回true时,会调用该方法让我们拖动换位置的逻辑(需要自己处理变换位置的逻辑)
 */
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {if(mListener != null){mListener.onMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
    }return true;
}
/**
 * 针对drag状态,当前target对应的item是否允许移动
 * 我们一般用drag来做一些换位置的操作,就是当前对应的target对应的Item可以移动
 */
@Override
public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current, RecyclerView.ViewHolder target) {return true;
}

/**
 * 针对drag状态,当drag ItemView跟底下ItemView重叠时,可以给drag ItemView设置一个Margin值
 * 让重叠不容易发生,相当于增大了drag Item的区域
 */
@Override
public int getBoundingBoxMargin() {return 0;
}
/**
 * 针对drag状态,当滑动超过多少就可以出发onMove()方法(这里指onMove()方法的调用,并不是随手指移动的View)
 */
public float getMoveThreshold(RecyclerView.ViewHolder viewHolder) {return .5f;
}
/**
 * 针对drag状态,在drag的过程中获取drag itemView底下对应的ViewHolder(一般不用我们处理直接super就好了)
 */
public RecyclerView.ViewHolder chooseDropTarget(RecyclerView.ViewHolder selected,
                                                List<RecyclerView.ViewHolder> dropTargets,
                                                int curX,
                                                int curY) {return super.chooseDropTarget(selected, dropTargets, curX, curY);
}
/**
 * 当onMove return true的时候调用(一般不用我们自己处理,直接super就好)
 */
public void onMoved(final RecyclerView recyclerView,
                    final RecyclerView.ViewHolder viewHolder,
                    int fromPos,
                    final RecyclerView.ViewHolder target,
                    int toPos,
                    int x,
                    int y) {super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
}
/**
 * 针对swipe和drag状态,当一个item view在swipe、drag状态结束的时候调用
 * drag状态:当手指释放的时候会调用
 * swipe状态:当item从RecyclerView中删除的时候调用,一般我们会在onSwiped()函数里面删除掉指定的item view
 */
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {super.clearView(recyclerView, viewHolder);
    viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT);
    viewHolder.itemView.setAlpha(1);
    viewHolder.itemView.setScaleY(1);
    viewHolder.itemView.setScaleX(1);
}
/**
 * 针对swipe和drag状态,整个过程中一直会调用这个函数,随手指移动的view就是在super里面做到的(和ItemDecoration里面的onDraw()函数对应)
 */
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){float alpha = 1 - Math.abs(dX) / viewHolder.itemView.getWidth();
        viewHolder.itemView.setAlpha(alpha);
        viewHolder.itemView.setScaleX(alpha);
        viewHolder.itemView.setScaleY(alpha);
    }super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
/**
 * 针对swipe和drag状态,整个过程中一直会调用这个函数(和ItemDecoration里面的onDrawOver()函数对应)
 * 这个函数提供给我们可以在RecyclerView的上面再绘制一层东西,比如绘制一层蒙层啥的
 */
public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
/**
 * 针对swipe和drag状态,当手指离开之后,view回到指定位置动画的持续时间(swipe可能是回到原位,也有可能是swipe掉)
 */
public long getAnimationDuration(RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {return super.getAnimationDuration(recyclerView, animationType, animateDx, animateDy);
}
/**
 * 针对drag状态,当itemView滑动到RecyclerView边界的时候(比如下面边界的时候),RecyclerView会scroll,
 * 同时会调用该函数去获取scroller距离(不用我们处理 直接super)
 */
public int interpolateOutOfBoundsScroll(RecyclerView recyclerView,
                                        int viewSize,
                                        int viewSizeOutOfBounds,
                                        int totalSize,
                                        long msSinceStartScroll) {return super.interpolateOutOfBoundsScroll(recyclerView, viewSize, viewSizeOutOfBounds, totalSize, msSinceStartScroll);
}
/**
 * 针对swipe和drag状态,当swipe或者drag对应的ViewHolder改变的时候调用
 * 我们可以通过重写这个函数获取到swipe、drag开始和结束时机,viewHolder 不为空的时候是开始,空的时候是结束
 */
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE || actionState == ItemTouchHelper.ACTION_STATE_DRAG) {viewHolder.itemView.setBackgroundColor(Color.parseColor("#3F51B5"));
    }super.onSelectedChanged(viewHolder, actionState);
}
/**
 * 针对swipe状态,是否允许swipe(滑动)操作
 */
public boolean isItemViewSwipeEnabled() {return true;
}
/**
 * 针对swipe状态,swipe滑动的位置超过了百分之多少就消失
 */
public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {return .5f;
}
/**
 * 针对swipe状态,swipe的逃逸速度,换句话说就算没达到getSwipeThreshold设置的距离,达到了这个逃逸速度item也会被swipe消失掉
 */
public float getSwipeEscapeVelocity(float defaultValue) {return defaultValue;
}
/**
 * 针对swipe状态,swipe滑动的阻尼系数,设置最大滑动速度
 */
public float getSwipeVelocityThreshold(float defaultValue) {return defaultValue;
}
/**
 * 针对swipe状态,swipe 到达滑动消失的距离回调函数,一般在这个函数里面处理删除item的逻辑
 * 确切的来讲是swipe item滑出屏幕动画结束的时候调用
 */
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {if(mListener != null){mListener.onRemove(viewHolder.getAdapterPosition());
    }
}
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {private ItemTouchListener mListener;
    public ItemTouchHelperCallback(ItemTouchListener listener){mListener = listener;
    }
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {return makeMovementFlags(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.LEFT);
    }@Override
    /**
     * 针对swipe状态,swipe 到达滑动消失的距离回调函数,一般在这个函数里面处理删除item的逻辑
     * 确切的来讲是swipe item滑出屏幕动画结束的时候调用
     */
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {if(mListener != null){mListener.onRemove(viewHolder.getAdapterPosition());
        }}/**
     * drag状态下,在canDropOver()返回true时,会调用该方法让我们拖动换位置的逻辑(需要自己处理变换位置的逻辑)
     */
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {if(mListener != null){mListener.onMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
        }return true;
    }@Override
    /**
     * 针对swipe和drag状态,整个过程中一直会调用这个函数,随手指移动的view就是在super里面做到的(和ItemDecoration里面的onDraw()函数对应)
     */
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){float alpha = 1 - Math.abs(dX) / viewHolder.itemView.getWidth();
            viewHolder.itemView.setAlpha(alpha);
            viewHolder.itemView.setScaleX(alpha);
            viewHolder.itemView.setScaleY(alpha);
        }super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }@Override
    /**
     * 针对swipe和drag状态,整个过程中一直会调用这个函数(和ItemDecoration里面的onDrawOver()函数对应)
     * 这个函数提供给我们可以在RecyclerView的上面再绘制一层东西,比如绘制一层蒙层啥的
     */
    public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }@Override
    /**
     * 针对swipe和drag状态,当一个item view在swipe、drag状态结束的时候调用
     * drag状态:当手指释放的时候会调用
     * swipe状态:当item从RecyclerView中删除的时候调用,一般我们会在onSwiped()函数里面删除掉指定的item view
     */
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {super.clearView(recyclerView, viewHolder);
        viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT);
        viewHolder.itemView.setAlpha(1);
        viewHolder.itemView.setScaleY(1);
        viewHolder.itemView.setScaleX(1);
    }
}
interface ItemHelperListener {/**
     * 删除时的回调
     */
    fun onRemove(position:Int)/**
     * 交换时的回调
     */
    fun onSwap(formPosition:Int, toPosition:Int)
}
public class MyAdapter2 extends RecyclerView.Adapter implements IListener,ItemTouchListener{
@Override
public void onMove(int from, int to) {Collections.swap(mData,from,to);
    notifyItemMoved(from,to);
}@Override
public void onRemove(int position) {mData.remove(position);
    notifyItemRemoved(position);
}
}

http://chatgpt.dhexx.cn/article/2m2YWNSO.shtml

相关文章

JavaScript中的回调函数(callback)

前言 callback&#xff0c;大家都知道是回调函数的意思。如果让你举些callback的例子&#xff0c;我相信你可以举出一堆。但callback的概念你知道吗&#xff1f;你自己在实际应用中能不能合理利用回调实现功能&#xff1f; 我们在平时的学习中容易犯不去深究的病&#xff0c;功…

scrapy.Request callback不执行

上一篇博客介绍了Scrapy Post Request payload数据的问题&#xff0c;本篇记录一下scrapy.Request callback不执行的问题。 1、大家都说的解决方式&#xff0c;虽然没有解决我的问题&#xff0c;但是还是写到这里&#xff0c;算是一个总结&#xff1a; 1.在scrapy.Request方法里…

UVM: callback机制 uvm_callback和uvm_callbacks

callback机制 callback机制提高代码的可重用性&#xff0c;还用于构建异常的测试用例。 广义的callback机制有post_randomize()&#xff0c;pre_body(),post_body(), pre_do(), mid_do()等&#xff0c;它们提供了额外的接口给用户。 原理 以在driver中提供callback函数接口为…

SV和UVM的Callback例程

文章目录 前言一、SystemVerilog Callback例程二、UVM Callback例程总结 前言 记录SV和UVM的两个callback的例程&#xff0c;方便以后用的时候进行查阅。 一、SystemVerilog Callback例程 二、UVM Callback例程 总结 记录SV和UVM的callback例程。

ajax中的callback,ajax callback是什么

ajax的callback是什么? callback是ajax中的回调函数,是在服务器对一个请求对象作出响应时调用的函数。浏览器会在某个时刻”回调”这个函数,根据5种返回状态的情况处理ajax请求结果。 callback回调函数怎么理解? 想弄明白回调函数,首先的清楚地明白函数的规则。在javascri…

通俗易懂的讲解回调函数,保证让你看懂callback

什么是回调函数&#xff1f;相信很多人都似懂非懂&#xff0c;半懂不懂&#xff0c;今天就通俗易懂的讲解回调函数&#xff0c;让你能理解回调函数的大部分作用及意义。 目录 定义 形象的例子 代码解释 用处及完整代码例子 定义 先上常规的定义&#xff1a; 回调函数也是…

callback(回调函数)

先讲点题外话。 编程分为两类&#xff1a;系统编程&#xff08;system programming&#xff09;和应用编程&#xff08;application programming&#xff09;。所谓系统编程&#xff0c;简单来说&#xff0c;就是编写库&#xff1b;而应用编程就是利用写好的各种库来编写具某种…

Callback回调函数介绍(C语言)

目录 1. 回调函数的定义 2. 为什么要用回调函数 3. 怎么用回调函数 3.1 怎么使用没有参数的回调函数 3.2 怎么使用带参数的回调函数 1. 回调函数的定义 最近在工作中经常用到回调函数callback&#xff0c;总结一下。 先来看看维基百科对callback的解释&#xff1a;In co…

Callback函数详解

http://shiwawa.blog.hexun.com/9925417_d.html 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢…

《软件质量保证与测试》学习笔记【第一章 软件测试基本概念】

目录 前言为什么要进行软件测试什么是软件缺陷1.1 什么是软件测试1.2 软件测试与CMMI软件质量保证SQA与软件测试的关系 1.3测试用例1.3.1什么是测试用例测试用例的五大要素测试用例1.3.2测试用例的评价标准1.3.3测试用例设计的基本原则1.3.4测试用例模板 1.4测试环境1.4.1什么是…

群晖NAS教程(十)、利用Docker安装蚂蚁笔记(leanote)

为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客 群晖NAS教程(十)、利用Docker安装蚂蚁笔记(leanote) 蚂蚁笔记是一款特别棒的笔记软件,支持Markdown语法,是程序员必备的软件之一。下面我们就在群晖DS918+的机器上docker出来一个耍耍。 一、下载蚂蚁笔记(leanote)镜…

基于 Qt 框架的开源笔记软件 VNote

关注、星标公众号&#xff0c;直达精彩内容 来源&#xff1a;OSC开源社区 作者&#xff1a;tamlok VNote是一个受Vim启发开发的专门为Markdown而优化、设计的笔记软件。 授权协议&#xff1a;MIT 开发语言&#xff1a;C/C JavaScript HTML/CSS SHELL 操作系统&#xff1a;跨平台…

VisionPro软件笔记

VisionPro笔记 1、CogPMAlignTool的操作方法&#xff1a; 抓取图像-设置训练区域及参数-训练模板-设置运行参数与区域-运行-查看结果 2、CogPMAlignTool的基本原理&#xff1a; 图案位置搜索工具&#xff08;识别定位&#xff09;基于边缘特征的模板而不是基于像素的模板匹配…

一款开源的支持离线的支持MarkDown的优秀笔记软件----思源笔记

日常工作中&#xff0c;大家可能会用笔记软件记录自己积累的一些知识&#xff0c;组建自己的知识管理系统&#xff0c;常用的工具可能有云笔记&#xff0c;如有道云笔记&#xff0c;印象笔记等&#xff0c;但是有时候在工作中&#xff0c;信息比较敏感&#xff0c;不能够将信息…

一文了解常用效率记笔记软件(超过20款含有图片和双向链笔记)

前言 Mac 软件推荐下载网址 麦软网&#xff1a;https://www.macfz.com腾讯柠檬&#xff1a;https://lemon.qq.com/lab 更新时间 第七次更新 6 月 28 号 &#xff0c;对于有道和印象的理解&#xff0c;有时间把这篇文章拆分下第六次更新 5 月 27 号&#xff0c;更新了如何看待…

知识管理软件,有道云笔记的优缺点和C笔记

前言 软件有道云笔记C笔记发布时间2011年6月28日还在内测所属公司网易公司北京创新乐知网络技术有限公司 1.笔记的重要性&#xff1a; 大家有没有一种种感受&#xff0c;我们成日钻研书籍&#xff0c;天天认真听讲&#xff0c;发奋学习&#xff0c;收到的反馈却并不理想&…

OneNote-做笔记的软件-强烈推荐

一、认识电子笔记本 普通笔记本转化为电子笔记本 笔记可以将我们的想法和从外部获取的信息进行归纳和整理&#xff0c;而电子笔记本就是将传统的笔记进行了电子化电子笔记本的优势 可搜索统一管理高效编辑可修改性多端同步主流电子笔记本 OneNoteEver note(印象笔记)Notability…

推荐几款好用的云笔记软件

一直钟爱印象笔记&#xff0c;程序员的电脑上必装的软件&#xff0c;但最近期限到了&#xff0c;再也不能像以前无限制的上传文件&#xff0c;续费也比去年的只要九块九一年高出了很多倍&#xff0c;因此&#xff0c;注册试用了其他的笔记&#xff0c;发现云笔记众多&#xff0…

php个人笔记系统 开源,Github精选!一款开源免费的轻量级笔记软件

更多精彩内容&#xff0c;请关注公众号【平凡而诗意】 ​ 笔记软件是工作和学习过程中经常会用到的软件&#xff0c;会议纪要、工作事项、待办&#xff0c;都需要用到笔记软件&#xff0c;这样能够明确做事的先后顺序&#xff0c;能够提高做事的效率。 笔记软件数不胜数&#x…

软件工程复习笔记 类图

类图 前言1 类图的概念1、类图2、类图的作用3、类图的组成元素 2 UML中的类&#xff08;&#xff11;&#xff09;类的定义&#xff08;&#xff12;&#xff09;类的表示&#xff08;&#xff13;&#xff09;类的命名&#xff08;&#xff14;&#xff09;类的属性&#xff0…