RecyclerView自定义动画学习记录

RecyclerView item 可展开动画效果的实现 RecyclerView item 可展开动画效果的实现前文提要:1.相关说明:1-1.布局文件:1-2.动画工具类说明(代码我基本上都添加了注释):1-3.问题:2.如何使用:2-1.viewHoler 需要实现 ExpandableViewHoldersUtil.Expandable 接口2-2.adapter2-3.ExpandableViewHoldersUtil3.结束: 前文提要: A... 阅读详情

这篇博客主要是用来记录博主在学习RecylcerView的自定义动画时的一些心得与遗留的疑惑,如果有写错的地方,请指出~。希望这篇博客能对大家有帮助~
首先:在观看本博客之前,需要掌握对RecyclerView的一些基础的使用,例如RecyclerView的adapter的实现等。本篇博客主要记录对于RecyclerView的自定义动画的实现,因此其他知识点上不会提太多。
话不多说先上效果:
效果图
这个自定义动画中实现了添加item时的的动画与移除item时的动画。本例能通过点击添加信息按钮和删除信息按钮添加与移除item,和通过点击item来语出RecyclerView的item。
先看移除动画的实现,老样子一步一步来,要定制自定义动画,我们需要继承SimpleItemAnimator类
在这个类中,我们需要重写它的八个方法

public class RecyclerviewAnimation extends SimpleItemAnimator{
    @Override
    public boolean animateRemove(RecyclerView.ViewHolder holder) {
        return false;
    }

    @Override
    public boolean animateAdd(RecyclerView.ViewHolder holder) {
        return false;
    }

    @Override
    public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) {
        return false;
    }

    @Override
    public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromLeft, 
                                 int fromTop, int toLeft, int toTop) {
        return false;
    }

    @Override
    public void runPendingAnimations() {

    }

    @Override
    public void endAnimation(RecyclerView.ViewHolder item) {

    }

    @Override
    public void endAnimations() {

    }

    @Override
    public boolean isRunning() {
        return false;
    }
   }

由于是实现移除item时的动画,我们需要先实现animateRemove(RecyclerView.ViewHolder holder)这个方法,这个方法在我们调用notifyItemRemoved方法时会被系统调用。

    public boolean animateRemove(RecyclerView.ViewHolder holder) {
        View view = holder.itemView;
        view.setAlpha(1);
        MyAdapter.MyHolder myHolder = (MyAdapter.MyHolder) holder;
        removeAnimatorList.add(myHolder);
        return true;
    }

在这个方法中,我们通过传递过来的ViewHolder参数获取此次需要实行动画的View,并将ViewHolder保存在removeAnimationList中。removeAnimatorList是一个保存持有将要执行动画的View的ViewHolder的List【即removeAnimationList中添加的就是将要执行remove动画的View】。由于是一个移除动画,我们需要的动画效果是让该View渐渐消失(即alpha从1到0)。因此在动画开始之前,我们调用View的setAlpha将参数设1。

animateRemove默认返回false,我们将返回值设置为true,表示在执行完animateRemove方法之后,系统会自动帮我们调用 runPendingAnimations()方法,在runPendingAnimations方法中我们进行移除动画的播放与监听。

public void runPendingAnimations() {
 for(int i = 0;i<removeAnimatorList.size();i++){
            final MyAdapter.MyHolder myHolder = removeAnimatorList.get(i);
            removeRunningAnimatorList.add(myHolder);
            View view = myHolder.itemView;
            final ViewPropertyAnimatorCompat animator = ViewCompat.animate(view);
            animator.alpha(0).setDuration(1000).setListener(new ViewPropertyAnimatorListener() {
                @Override
                public void onAnimationStart(View view) {

                }

                @Override
                public void onAnimationEnd(View view) {
                    animator.setListener(null);
                    view.setAlpha(0);
                    removeRunningAnimatorList.remove(myHolder);
                    dispatchRemoveFinished(myHolder);

                    if(!isRunning()){
                        dispatchAnimationsFinished();
                    }
                }

                @Override
                public void onAnimationCancel(View view) {

                }
            }).start();

        }
        removeAnimatorList.clear();
    }

在这个方法中,循环取出removeAnimatorList中的view,并将正在执行动画的View添加到removeRunningAnimatorList中,removeRunningAnimatorList是一个持有保存正在执行动画的View的ViewHolder的List【即removeRunningAnimatorList添加的是正在执行动画的View】,同时为每个view设置动画和监听器。
在监听到该View的动画结束时,先将View置为透明,再将该View的holder从从removeRunningAnimatorList中移除,并通过 dispatchRemoveFinished()方法告知系统remove动画播放已经结束。
isRunning方法是判断该自定义动画是不是全部结束【即没有正在进行remove动画与将要进行remove动画的view】。如果全部结束则通过 dispatchAnimationsFinished()方法告知系统动画全部结束。
在单个item的动画结束之后,系统会调用endAnimation()法,在该方法中,我们需要做的事情和监听动画结束的方法中一样,将该View的holder从removeAnimatorList中移除并且将View设置为透明。

public void endAnimation(RecyclerView.ViewHolder item) {
        View view = item.itemView;
        view.animate().cancel();

      for (int i = 0; i < removeAnimatorList.size(); i++) {
         if (removeAnimatorList.get(i) == item) {
                    removeAnimatorList.remove(item);
                }
            }
            view.setAlpha(0);
            dispatchRemoveFinished(item);


        if (!isRunning()) {
            dispatchAnimationsFinished();
        }

    }

最后在所有的动画结束之后,将所有要执行动画的View都设置为透明,并将其从removeAnimatorList中移除,同时将正在执行动画View的动画取消

    public void endAnimations() {
    for(int i = 0;i<removeAnimatorList.size();i++){
                MyAdapter.MyHolder myHolder = removeAnimatorList.get(i);
                View view = myHolder.itemView;
                view.setAlpha(0);
                removeAnimatorList.remove(myHolder);
                dispatchRemoveFinished(myHolder);
            }

            for(int i = 0;i<removeRunningAnimatorList.size();i++){
                View view = removeRunningAnimatorList.get(i).itemView;
                view.animate().cancel();
            }
    }

isRunning方法也需要我们重写,该方法用来判断动画是否在运行,只要removeRunningAnimatorList与removeAnimatorList其中之一不为空,那么就可以认为动画在运行

    public boolean isRunning() {
        return  !removeAnimatorList.isEmpty()||
                !removeRunningAnimatorList.isEmpty();
    }

然后为RecylcerView设置animator即可

RecyclerviewAnimation animation = new RecyclerviewAnimation();
recyclerView.setItemAnimator(animation);

效果
remove动画
增加动画也与remove动画流程一致,只需要将View的setAlpha倒过来设置即可。这里就不再贴出代码并分析,有兴趣可以在下面的链接中下载Demo。
最后要提的是关于通过点击RecylerView的item对item进行移除。RecyclerView与ListView不同,ListView有系统写好的item点击监听供我们使用,而RecyclerView没有,因此RecyclerView的点击事件需要我们自行实现。
首先,现在RecyclerView的Adapter中设置一个接口与接口变量

    private OnItemClick click;
    interface OnItemClick{
        void OnItemClick(int position,MyHolder holder);
    }

    public void setOnItemClick(OnItemClick click){
        this.click = click;
    }

在本例中RecyclerView的item为一个TextView。因此在为显示item进行点击监听,实际上可以设置为对TextView的点击监听。

    @Override
    public void onBindViewHolder(final MyHolder holder, final int position) {
        holder.getTextView().setText(messageList.get(position));
        if(click != null){
            holder.getTextView().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    click.OnItemClick(position,holder);
                }
            });
        }
    }

最后我们只需要在Activity中为Adapter注册监听,并且实现该接口即可。

myAdapter.setOnItemClick(this); 
public void OnItemClick(int position, MyAdapter.MyHolder holder) {
        messageList.remove(position);
        myAdapter.notifyItemRemoved(position);
        Toast.makeText(MainActivity.this,"您点击的第"+(position+1)+"条数据被删除",Toast.LENGTH_SHORT).show();
    }

PS:本Demo存在的问题
在多次调用notifyItemRemoved方法以后会出现个别item不显示的问题
item显示不全
但是在notifyItemRemoveedf方法法之后调用notifyDataSetChanged可以解决item不显示问题,但是删除不会再出现动画效果。
这个问题困扰了我很久,也搜了一些资料,有的说调用notifyItemRangeChanged方法,尝试过这个方法但是被包括在改变范围里的item都会出现移除动画的效果。如果有大神知道如何解决,希望在评论里解答一下这个疑问。


最后本例Demo的下载地址
Demo

RecyclerView 源码分析(四)RecyclerView的动画机制 转载自琼珶和予 RecyclerView 源码分析(四)RecyclerView的动画机制 RecyclerView的动画机制 距离上一篇RecyclerView源码分析的文章已经过去了10多天,今天我们将来看看RecyclerView的动画机制。不过,本文不会分析ItemAnimator相关的知识,而是理解RecyclerView怎么执行ItemAnimator的,有关ItemAniamtor的知识,后面我会写专门的文章来分析。   本文参考资料: RecyclerView animations - An 阅读详情

相关推荐

Android RecyclerView 动画展开item显示详情

stackoverflow上看到这个问题,答主给了个demo http://stackoverflow.com/questions/27446051/recyclerview-animate-item-resize效果如下 res文件 main_activity文件就是一个recyclerview main_item是两个textview 一个标题一个详细信息MainActivity就是加载

mmga的专栏 6637

[Android]自定义RecyclerView中View的动画

官方有一个默认Item动画类DafaultItemAnimator,其中 DefaultItemAnimator 继承了SimpleItemAnimator 继承了 RecyclerView.ItemAnimator。

Runstoppable的博客 1271

RecyclerView——实现自定义LayoutManager

参考资料参考资料1; 参考资料2; 参考资料3; 参考资料4; 背景介绍RecyclerView由于其强大的扩展性,现在已经逐步的取代了ListView和GridView了。为了实现不同的布局效果,我们会用到官方提供的LinearLayoutManager、GridLayoutManager和StaggeredGridLayoutManager。但这些布局只能满足日常需求,在一些比较复杂的布

chice的博客 8121

RecyclerView详解 —— 自定义动画

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

1万+

自定义RecyclerView添加、删除、更新动画

使用方法请移步我的博客http://blog.youkuaiyun.com/hongtao_studio/article/details/50733118

暗月项目七详解

本文围绕“暗月靶场项目七”展开,记录了一次从外网 Web 入口逐步深入内网并最终获取域控目标的完整实训过程。

Re_K123的博客 418

Android RecyclerView 详解(三) RecyclerView的动画实现(移除、添加、改变、移动)和自定义动画的实现

Android RecyclerView 详解(三) RecyclerView的动画实现(移除、添加、改变、移动) 一丶添加删除时候的刷新问题 先上一下效果图吧 1.为了方便起见我们还是先添加三个按钮分别实现添加删除和改变 2.在Adapter中写调用方法并进行刷新 public void remove(int position){ list

SuperBigLw的博客 2万+

阿里云大模型ACP认证模拟考试(三)

【摘要】:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 3581

自定义RecyclerView动画——实现remove飞出效果

我们经常会遇到在一个list中删除一条数据,这时候一般会有一个飞出的动画效果,如下图:在RecyclerView中可以通过setItemAnimator函数设置一个ItemAnimator,实现item的add、remove、change等动作的动效。下面我们就通过ItemAnimator来实现上面的效果。首先创建一个类,继承至SimpleItemAnimator,如下:class FlyAnim......

公众号:BennuCTech 7644

【AI开源】Understand-Anything 完整使用教程(2026最新版)

Understand-Anything是一款基于交互式知识图谱的AI学习与开发平台,能够将代码库转化为可视化知识结构,支持语义搜索、上下文问答和全流程开发。核心功能包括代码知识图谱化、AI辅助学习和多编码代理集成。支持TypeScript/JavaScript、Python等多种语言,要求Node.js 20+和16GB以上内存。提供NPM、Docker和源码三种安装方式,支持增量更新和团队知识共享。与同类产品相比,在交互式图谱、语义搜索和AI集成方面更具优势。适用于代码学习、大型项目维护和团队协作等场景。

与时俱进,开放共享 7216

Python 打包与发布陷阱:如何用 setuptools 和 PyInstaller 生成跨平台可执行文件?

使用。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1207

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

坏消息是内部没有能直接提供调用开始移动动画或删除动画的方法有的是runPendingAnimations()该方法内部设置了各个动画的执行实际我们重写这个方法几乎等同于需要重写整个类。但是recycleView默认的是删除动画执行完之后才去执行移动动画这种情况下思路1就无法达到预期只能重写SimpleItemAnimator了。简单的场景下思路1是可以达到预期效果的,但是个人在项目中遇到了另一个难题,ui给的动画需要在执行删除动画的同时下方列表要同时上移。...

Azadoo的博客 1850

使用单片机和电流互感器对非正弦周期电流有效值测定

使用单片机和电流互感器,利用一种高速采样的方法来进行有效值测定

月光绿叶滴水音乐 3945

Android学习笔记(三)--ListView与RecyclerView

在学习了几天Android之后,打算写个简单的app来试试手,于是就想写一个“便签”。在写列表的时候自然的想到了用一个ListView然后配置一个adpter来显示信息,但是呢,在逛论坛的时候发现现在使用RecyclerView的比较多,于是就看了几个demo,晚上也自己动手写了写。 使用完的感受是RecyclerView确实强大,有它流行起来的道理,毕竟长江后浪推前浪,前浪倒在沙滩上。让人感受明

CallMeSP的博客 1414

别再手动测接口了!用Pytest+Requests+Allure搭建你的第一个自动化框架(附完整源码)

本文详细介绍了如何使用Pytest+Requests+Allure搭建Python接口自动化测试框架,涵盖环境准备、核心组件封装、测试用例设计、报告生成及CI/CD集成等关键步骤。通过实战案例和完整源码,帮助开发者快速构建高效的接口自动化测试解决方案,提升测试效率和质量。

weixin_42546508的博客 321

腾讯开源SuperSonic:AI+BI如何重塑数据分析?

SuperSonic是腾讯开源的AI+BI平台,融合Chat BI与Headless BI,为制造企业提供实时数据分析。它通过自然语言交互打破数据壁垒,实现生产、库存、质量、供应链等多环节优化,提升决策效率,其开源生态与扩展性助力企业数字化转型与数据价值挖掘。

数据与算法架构提升之路专栏 4541

RecyclerView.ItemAnimator实现动画效果

Item动画来源在RecyclerView的源码中,有一个ItemHolderInfo.java。其源码如下:ItemHolderInfo主要是用来表示RecyclerView中item...

zxm317122667的专栏 1826

基于 MATLAB BP 神经网络的财务预测

通过基于 MATLAB BP 神经网络的财务预警模型,我们可以对企业的财务风险进行有效地识别和预测。在具体实现过程中,需要注意对财务数据的预处理、模型参数的调整以及结果的解释等问题。MLP模型的输入层、输出层和隐含层之间均为全连接,每个神经元都是上一层神经元的加权求和再加偏置后的非线性变换。其中,输入层接受财务数据,输出层输出财务预测结果,隐含层则对输入数据进行处理和抽象。其中,X’是标准化后的值,X是原始值,μ_i 和σ_i 分别是指标 i 在样本中的均值和标准差。其中,X’是标准化后的值,X是原始值。

TechPulseZ的博客 922

RecyclerView加载动画

引言 看到很多RecyclerView都有不错的动画,我动画知识也很欠缺,就决定拿他来玩玩。 本文先玩设置RecyclerView的加载动画 代码 效果 实现步骤: 1.在res/anim文件下新增动画animate.xml <set xmlns:android="http://schemas.android.com/apk/res/android" android:duratio...

weixin_43753008的博客 2452

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android RecyclerView 动画处理 流程 原理(源码分析第二篇)

Android RecyclerView 动画 流程 原理。经过上面的分析,其实我们的重点变成了,view数据的组织与记录(动画前),view的数据的计算(动画后),心里要有这个数。子view的y轴坐标,由动画前的位置,滑动到 动画后的位置(我们暂时只讨论常见的竖向布局)ViewInfoStore这个类,抽象了所有的子View的(为了运行动画的)跟踪信息。添加一个view:添加的View 显示出来,它下面的所有view向下移动一格距离。

【全部原创,全部干货】【Android、车载MCU、AIGC】 1512

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RecyclerView 动画器教程 - 使用 wasabeef/recyclerview-animators

RecyclerView 动画器教程 - 使用 wasabeef/recyclerview-animators recyclerview-animatorsAn Android Animation library which easily add itemanimator to RecyclerView items.项目地址:https://gitcode.com/gh_mirrors/re/r...

gitblog_00433的博客 773

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RecyclerView源码浅析之数据更改与动画

概述上一篇我们针对RecyclerView的绘制流程做了简单的分析,重点放在了dispatchLayoutStep2()这个真正对子View操作的函数上,它完成了:子View的添加(LinearLayoutManager通过ChildHelper添加)、测量、布局。绘制流程虽然有了大概的了解,但却引出了很多问题:dispatchLayoutStep1()和dispatchLayoutStep3()有

chengkun_123的博客 1645

RecyclerView源码分析三之动画分析

介绍 在上一篇中,我们分析了RecyclerView的绘制与复用。接下来我们继续分析RecyclerView的动画实现原理。RecyclerView的动画分为两个阶段: PreLayout PostLayout 为什么RecylerView的动画要分为两个阶段 众所众知,ViewGroup可以通过LayoutTransition实现其内部childView的动画变化。在普通的ViewGroup,其内部的View的动画就是显示和隐藏。但是ReyclerView需要的动画有些不同,因为它有滚动的效果。比如:

C安君的博客 531

学习RecyclerView

稍做记录 说明: 这是用来给自己回忆的,估计你们也看不太懂 有时间我再整理吧2018.7.15 28.May 明日之星——RecyclerView 学习内容 1、回收与复用View 2、setLayoutManager显示 3、ItemDecoration item如何分隔 4、ItemAnimator Item增加与删除动画效果 SimpleAdapter extends RecyclerVi...

weixin_43405535的博客 155

Recyclerview默认动画导致调用notifyItemChanged(position)更新时ViewHolder变动引起的问题

最近在做一个折叠TextView效果时,遇到的一个奇怪的bug,记录一下。api来源:知乎日报 点赞之后会调用notifyItemChanged(position)来更新点赞状态,这时候发生了奇怪的bug,点赞与取消点赞之后,所引用的回复会自动打开或关闭(发现此问题时未实现记录打开状态功能,实现后也可解决此问题)。 如图: what happened! 感觉出现的问题可能与复

lemay的博客 6446

RecyclerView —— 自定义LayoutManager

对LayoutManager中的基本的几个集合和方法了解了,自定义LayoutManager就完成一半了。 对集合和方法的解释: LayoutManager: 1.getViewForPosition():是Recycler的方法,在需要获取新的View时直接申请,返回的View可能是之前回收的垃圾View,也可能是new出来的新View(RecyclerView完成); 取View时, (...

u012588160的博客 1307
上一篇: AutoCompleteTextView与自定义Adapter实现自动补全
zln2016930
博客等级 码龄12年 11粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值