自定义recycleView的删除&移动的动画

Android:动态去掉RecyclerView动画导致时长累加问题解决 去掉动画后多次notifyItemChanged会发现每次这个动作的时长越来越长 阅读详情

首先 RecycleView是有一套自己默认的动画、以及相应执行时机
但是在项目开发中,遇到了需要为删除item的动效进行调整
思路1. 可以在holder中(比如点删除的点击事件)直接为当前view设置自定义动画并执行
思路2. 重写recycleView默认动画 SimpleItemAnimator

简单的场景下思路1是可以达到预期效果的,但是个人在项目中遇到了另一个难题,ui给的动画需要在执行删除动画的同时 下方列表要同时上移。

但是recycleView默认的是删除动画执行完之后才去执行移动动画 这种情况下思路1就无法达到预期 只能重写SimpleItemAnimator了

好消息是recycleView自身已经封装好了一个默认DefaultItemAnimator该类中对抽象类SimpleItemAnimator所有方法都以重写实现 我们只要继承DefaultItemAnimator对需要调整的方法重写即可
坏消息是 内部没有能直接提供调用开始移动动画或删除动画的方法 有的是runPendingAnimations() 该方法内部设置了各个动画的执行时机,我们重写这个方法 几乎等同于需要重写整个类
源码如下

  @Override
    public void runPendingAnimations() {
        boolean removalsPending = !mPendingRemovals.isEmpty();
        boolean movesPending = !mPendingMoves.isEmpty();
        boolean changesPending = !mPendingChanges.isEmpty();
        boolean additionsPending = !mPendingAdditions.isEmpty();
        // 判断是否有动画需要执行
        if (!removalsPending && !movesPending && !additionsPending && !changesPending) {
            return;
        }
        // 执行Remove动画
        for (RecyclerView.ViewHolder holder : mPendingRemovals) {
            animateRemoveImpl(holder); // 实际执行Remove动画的方法
        }
        mPendingRemovals.clear();
        // Move动画
        if (movesPending) {
            // 注意: Move动画并不是马上执行,会放入一个Runnable
            Runnable mover = new Runnable() {
                @Override
                public void run() {
                    for (MoveInfo moveInfo : moves) {
                        animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY,
                                moveInfo.toX, moveInfo.toY);
                    }
                }
            };
            // 如果有Remove动画,就在Remove动画结束之后执行Move动画
            // 如果没有Remove动画就马上执行
            if (removalsPending) {
                View view = moves.get(0).holder.itemView;
                ViewCompat.postOnAnimationDelayed(view, mover, getRemoveDuration());
            } else {
                mover.run();
            }
        }
        // Change动画,与Move动画一起执行
        if (changesPending) {
            // ......
            Runnable changer = new Runnable() {
                @Override
                public void run() {
                    for (ChangeInfo change : changes) {
                        animateChangeImpl(change);
                    }
                }
            };
            if (removalsPending) {
                RecyclerView.ViewHolder holder = changes.get(0).oldHolder;
                ViewCompat.postOnAnimationDelayed(holder.itemView, changer, getRemoveDuration());
            } else {
                changer.run();
            }
        }
        // 最后执行Add动画
        if (additionsPending) {
            // ......
            Runnable adder = new Runnable() {
                @Override
                public void run() {
                    for (RecyclerView.ViewHolder holder : additions) {
                        animateAddImpl(holder);
                    }
                    additions.clear();
                    mAdditionsList.remove(additions);
                }
            };
            // 在Remove、Move、Change动画都完成之后开始执行Add动画
            if (removalsPending || movesPending || changesPending) {
                long removeDuration = removalsPending ? getRemoveDuration() : 0;
                long moveDuration = movesPending ? getMoveDuration() : 0;
                long changeDuration = changesPending ? getChangeDuration() : 0;
                long totalDelay = removeDuration + Math.max(moveDuration, changeDuration);
                View view = additions.get(0).itemView;
                ViewCompat.postOnAnimationDelayed(view, adder, totalDelay);
            } else {
                adder.run();
            }
        }
    }

通过源码可以发现 我们要达到目标 只需要将 mover.run();执行的判断条件去掉即可 但是却要为此重写大量内容。

而从写删除数据的animateRemove()方法就要简便许多:
只需要为holder内的itemview增加动画即可

 @Override
    public boolean animateRemove(RecyclerView.ViewHolder holder) {
        Animation animation = null;
        // 增加item消失动画
        switch (itemId) {
            case R.id.rv_list:
                animation = AnimationUtils.loadAnimation(holder.itemView.getContext(), R.anim.move_animation);
                holder.itemView.setAnimation(animation);
                break;
            case R.id.rv_list_v2:
                animation = AnimationUtils.loadAnimation(holder.itemView.getContext(), R.anim.move_animation_v2);
                holder.itemView.setAnimation(animation);
                break;
            default:
                break;
        }
        
        // 原父类方法内容
        resetAnimation(holder);
        mPendingRemovals.add(holder);
        return true;
    }

最后则是外部设置:

recycleView.setItemAnimator(new RecycleAnimation());
// 设置删除动画执行时长 单位ms
recycleView.getItemAnimator().setRemoveDuration(333);
Android-RecycleView的使用 在主要布局文件中添加。 阅读详情

相关推荐

自定义RecyclerView的删除与移动动画

在某些情况下,我们可能需要自定义RecyclerView的删除和移动动画,以提升用户体验并增加交互的吸引力。上述代码中,我们首先获取拖动项的位置和目标位置。最后,将该动画效果应用到RecyclerView,并调用适配器的moveItem()方法将项从起始位置移动到目标位置。最后,将该动画效果应用到RecyclerView,并调用适配器的removeItem()方法删除指定位置的项。需要注意的是,上述代码中的removeItem()和moveItem()方法需要根据你的具体实现进行自定义。

HsvvDatabase的博客 529

RecyclerView 去除操作动画的方法

RecyclerView 去除操作动画的方法。

lujianfeiccie2009的专栏 731

非常实用的删除动画recyclerview

RecyclerView滑动删除,代码简单、自定义成都高,可以直接放在项目里使用

RecyclerView 单条目刷新notifyItem 去除闪烁动画

1.不使用动画 ((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); 2.动画播放时间置为0 recyclerView.getItemAnimator().setChangeDuration(0); 3.将DefaultItemAnimator类里的代码全部copy到自己写的动画类中,然后做一些修改(方案太重不推荐) ...

欲买桂花同载酒,抬望眼,还看今朝。 1737

即梦文生视频逆向接口部署使用

有的小伙伴不知道这个地址如何填写,你可以理解是步骤3上提供的 服务器或者本地电脑IP 地址(不要写 http://127.0.0.1 或者http://localhsot ) 是 (192.168.XXX.XXX 参考)

weixin_44245188的博客 3189

LlamaIndex 入门实战

LlamaIndex是一个“数据框架”,用于帮助构建LLM应用程序。它提供了各种工具,包括数据连接器,用于摄取现有数据源和数据格式(API,PDF,文档,SQL等),以及用于将数据结构化(索引,图形)以便与LLM轻松使用的方式。此外,LlamaIndex还提供了高级的检索/查询接口,可以输入任何LLM输入提示,并返回检索到的上下文和增强知识的输出。它还允许与外部应用程序框架(如LangChain,Flask,Docker,ChatGPT等)轻松集成。

AIGC搞起 1万+

Android RecycleView实现左滑删除的两种方式?

效果图: 在build中引用RecycleView //引入recycleView implementation 'androidx.recyclerview:recyclerview:1.2.0-beta01' 两种方式 一、自定义 左滑菜单帮助类ItemSlideHelper /** * 左滑菜单帮助类 */ public class ItemSlideHelper implements RecyclerView.OnItemTouchListener, GestureDetecto.

yyxhzdm的博客 2966

MIMIC数据库基本信息分析

一、MIMIC数据库中26张表介绍 数据库中一共有26张表,记录患者入院的各种信息,每张表的介绍如下所示。 表格名 信息 admission 患者基本信息,比如性别、种族、语言、宗教、婚姻、入院和出院时间、死亡时间等 callout 提供病人准备从ICU转出或者已经从ICU转出时相关信息 caregivers 记录医护人员信息(ID、类型、附加...

m0_37520426的博客 1万+

RecycleView动画效果和拖拽效果

RecycleView功能强大,很简单的几个步骤就能满足我们的开发需求,首先来三个效果 上图是动画,相当于加载数据的时候一个简单的动画效果 上图是拖拽,能够选择一行进行上下拖拽和任意一行进行交换 上图是删除,对不用的选项可以进行删除 下面对以上的效果一一进行讲解 首先是动画效果 创建动画的xml文件item_animation_fall...

jeekmary的博客 1840

yolov5 onnx推理时报错[ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type.

yolov5 onnxruntime 推理报错

zjulkw的博客 1223

半导体工艺仿真:离子注入工艺仿真_(8).损伤和缺陷仿真

离子注入工艺在半导体制造中是一个重要的步骤,用于在半导体材料中引入特定的掺杂剂。然而,离子注入过程中不可避免地会产生损伤和缺陷,这些损伤和缺陷会直接影响器件的性能和可靠性。因此,对离子注入工艺中的损伤和缺陷进行仿真研究是必不可少的。本节将详细介绍如何使用仿真软件对离子注入过程中的损伤和缺陷进行建模和分析。

2401_87715305的博客 1339

RecycleView之条目上下移动替换,左右移动删除

1//mainactivity类 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recycleView = (RecyclerView) findViewByI

hanhan861111的博客 1172

深度解读华为Limera:从舱内激光视觉融合看前融合技术的发展与演进

华为Limera激光雷达摄像头融合技术推动自动驾驶感知升级 华为推出的Limera创新性地将激光雷达与摄像头深度集成,采用共光路设计实现数据天然对齐,在小型障碍物识别等关键场景展现卓越性能。该产品代表了传感器前融合技术从分立走向共生的演进趋势,通过硬件级集成解决了多源异构数据融合难题。随着索尼堆叠式传感器等技术的出现,未来智能汽车感知系统将向高度集成的"超级传感器"方向发展,实现更精准的环境感知。Limera的发布标志着前融合技术从"可用"迈向"极致&quo

致力于lidar应用开发 398

RecycleView学习1 item动画

RecycleView设置动画方式.setItemAnimator(),sdk提供了默认的动画DefaultItemAnimator,要实现自定义动画需要实现SimpleItemAnimator。 需要实现下列方法: @Override public boolean animateRemove(RecyclerView.ViewHolder holder) { return...

lidongxiu0714 672

大数据分析利器:Tableau实战教程从入门到精通

你有3家分店,每月收集1000条销售数据(日期、分店、口味、销售额、订单数);想用Excel分析“哪家分店最赚钱”,但要做透视表→改格式→画柱状图,耗时30分钟,还经常因为公式错误返工;想看看“草莓味奶茶的月度销量趋势”,得手动筛选数据、调整折线图轴范围,稍不注意就漏看关键节点;想把分析结果分享给合伙人,Excel表格太抽象,对方盯着数字问“你到底想告诉我什么?

AI架构师小马 1493

Orange3实战教程:转换---预处理

部件提供了多种预处理方法,这些方法可以在单个预处理流程中组合使用。某些方法也可作为独立部件提供,支持更高级的技术和参数调整。连接到测试与评分:在交叉验证的每个批次中应用预处理器,随后学习器的预处理器会作用于预处理后的子集。连接到学习器:覆盖学习器的默认预处理流程,仅应用自定义流程(各学习器的默认步骤详见其文档)。直接连接到原始数据并输出预处理后的数据集,可能导致模型过拟合。:从原始数据中随机选择固定数量或百分比的特征,主要用于高级测试或教学用途。的预处理器输入,同时传入数据和学习器(如。

err2008的专栏 148

RecyclerView详解 —— 自定义动画

RecyclerView的强大之处相信大家已经体验到了,在上一篇RecyclerView详解 —— 自定义分割线我们学习了如何定义分割线,本篇将带领大家走进RecyclerView的动画世界。Google为我们提供了一个默认的动画实现,当数据添加、删除、更新时,会触发默认的动画效果: 接下来我们将一步步分析这个实现类,最后在它的基础上修改默认的动画效果。先来看DefaultItemAnimat

1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

recycleview的侧滑删除

今天介绍下项目中用到的侧滑删除 recycleview的侧滑删除 优化与项目的具体应用 先上图(简单的): 具体步骤: 1.recycleview垂直方向滑动,保证recycleview的item必须为viewgroup,并且item布局中的菜单view必须在最右边(项目中默认向左滑动有效),出可见屏幕外,指定具体的宽度。LayoutManager采用LinearLayoutManag...

xinhengqq的博客 1115

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

recycleview中item的侧滑扩展优化与项目中的具体应用

今天介绍下项目中用到的侧滑删除 recycleview的侧滑删除 优化与项目的具体应用 之前的文章只是实现了item的侧滑,但在项目中需要添加滑动的优化以及以后的扩展 扩展效果图: 分析: 滑动优化是指从部分展开过度到安全展开,添加动画机制或者使用Scroller控制滑动,使其不那么生硬 添加移动速度,进行展开判断 提供定制的item,封装菜单view与内容view,各个部位...

xinhengqq的博客 436

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

recycleView滑动删除,拖动排序

简易实现了下,惯例先上效果图: recycleView自带有个类ItemTouchHelper 可以方便的实现上图效果。 参考http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0630/3123.html 首先,我们迅速来一个recycleView mDatas = new ArrayList(

狸小华,还是个孩子。 1550

自定义View的滑动冲突解决(侧滑菜单和RecycleVIew的侧滑删除冲突)

  我们需要做的是一个侧滑菜单,在侧滑菜单的主页面中放置一个RecycleView,其中的item可以左右滑动删除,把两个功能都做了结果发现在一起时候会出现冲突,子布局不能使用,有布局同向滑动的冲突。 这里的RecycleView的滑动删除参考这位大佬的博客 https://blog.youkuaiyun.com/xiexuan2007/article/details/53156916 侧滑菜单参考的...

weixin_38916092的博客 1457

优雅地实现RecycleView的点击、拖动、和侧滑删除

优雅地实现RecycleView的点击、拖动、和侧滑删除自从发布了RecycleView之后,可以很方便的实现列表数据展示,同时只需要指定LayoutManager就可以实现列表、瀑布流、表格布局的无缝切换。RecycleView的所有东西都很美好,但是它没有提供像ListView那样的单击item的接口,都是通过对ViewHolder实现OnclickListener来实现单击事件。这里发现了一种

wangjianfengnb 1万+

RecycleView的Item Animator动画

RecyclerView能够通过mRecyclerView.setItemAnimator(ItemAnimator animator)设置添加、删除、移动、改变的动画效果。 RecyclerView提供了默认的ItemAnimator实现类:DefaultItemAnimator。如果没有特殊的需求,默认使用这个动画即可。 // 设置Item添加和移除的动画 mRecyclerView.s...

有的话没说出来之前,你是他的主人,一旦说出来你就成了他的奴隶||想要干好事,别太把自己当人,别把别人太不当人||认识这个人就是开了一扇窗户,就能看到不一样的东西,听到不一样的声音,能让你思考、觉悟,这已经够了 4384

RecycleView 移动和滑动删除数据

本例子中的数据是本地的固定数据, 如果需要网络数据 , 则更改数据源的获取即可 导入依赖 compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.android.support:cardview-v7:25.3.1 如果有网络数据,  则导入xUtils.jar 和 gson.ja

xiuxiu_861223的博客 365

Android RecycleView瀑布流点击吐丝、长按删除,很炫酷的一个列表展示

RecycleView是5.0之后推出的一个新控件,所以使用就要先导入一个依赖包:    compile 'com.android.support:recyclerview-v7:22.2.1'2.实现的效果挺好看的,需要的赶紧来试一下,真的感觉跟瀑布一样,虽然错乱,但是也形成的一个专属于它的风格,下面介绍一下怎么实现的:   (在我的一篇文章RecycleView的分割线里,详细的介绍了Recy...

______夏日飞雨 727

android 悬浮按钮 魅族,Android使用RecycleView实现魅族手机通讯录界面

原标题:Android使用RecycleView实现魅族手机通讯录界面本文作者本文由_小马快跑_投稿。_小马快跑_的博客地址:http://www.jianshu.com/u/185028550381本文主要是通过模仿魅族通讯录,学习一下RecycleView的基本用法,水平有限,如有不当之处,欢迎批评指正,不胜感激!先看通过RecycleView实现的一个效果图: 完整代码见github:htt...

weixin_35406812的博客 155
上一篇: xml编写补间动画 PopupWindow实现出现退出的动画
下一篇: FragmentTransaction replace与show hide实现Tab分页
Azadoo
博客等级 码龄7年 36粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值