RecyclerView notifyItem闪烁的问题

简介: 之前我们做点赞,用listview做的话,就是在item实现点击后,写一个scal动画,不过现在都转到RecyclerView,那么要做这种效果于是做了一个notifyItemChanged()的操作,功能都顺利实现,美中不足的是当前Item闪了一下,QA甚至为此提了Bug,一开始以为是图片加载库的问题,之后随着图片加载库从ImageLoader换成Picaso,又换成Glide,这个Bu

之前我们做点赞,用listview做的话,就是在item实现点击后,写一个scal动画,不过现在都转到RecyclerView,那么要做这种效果于是做了一个notifyItemChanged()的操作,功能都顺利实现,美中不足的是当前Item闪了一下,QA甚至为此提了Bug,一开始以为是图片加载库的问题,之后随着图片加载库从ImageLoader换成Picaso,又换成Glide,这个Bug一直如影随形。后来才发现“闪一下”原来是RecyclerView的默认动画,我的代码里有这样一句mRecyclerView.setItemAnimator(new DefaultItemAnimator());原来是这句代码搞的鬼,于是注掉再跑,但并没什么卵用。于是又改成mRecyclerView.setItemAnimator(null);仍然没什么卵用。看来加不加这句,RecyclerView都默认执行了这个动画,看来还有点小麻烦。


before.gif

先来了解下这个RecyclerView的动画吧。

RecyclerView.ItemAnimator

ItemAnimator能够帮助Item实现独立的动画。
ItemAnimator触发于以下三种事件:

某条数据被插入到数据集合中
从数据集合中移除某条数据
更改数据集合中的某条数据

在Android中默认实现了一个DefaultItemAnimator
,我们可以通过以下代码为Item增加动画效果:
recyclerView.setItemAnimator(new DefaultItemAnimator());

在之前的版本中,当数据集合发生改变时,我们通过调用notifyDataSetChanged()来刷新列表,因为这样做会触发列表的重绘,所以并不会出现任何动画效果,但现在我的需求是只改变了当前一个Item的状态,因此需要调用一些以notifyItem*()作为前缀的特殊方法,比如:

向指定位置插入Item
public final void notifyItemInserted(int position)
移除指定位置Item
public final void notifyItemRemoved(int position)
更新指定位置Item
public final void notifyItemChanged(int position)

但是现在的问题就是,调用notifyItem*()方法会触发RecyclerView的默认动画,而这个动画我并不想要,但是似乎并没有合适的办法来屏蔽这个动画,QA甚至认为这是个Bug,需要修复。与同行们交流了下,也有人遇到同样的问题,解决办法居然是调用notifyDataSetChanged()方法来刷新数据,这样就不会有闪一下的动画了。但是这样不就失去使用RecyclerView的优势和意义了吗?

最后我是通过重写RecyclerView的动画来解决这一“Bug”。

public class NoAlphaItemAnimator extends RecyclerView.ItemAnimator {

}

将DefaultItemAnimator类里的代码全部copy到自己写的动画类中,然后做一些修改。

首先找到private void animateChangeImpl(final ChangeInfo changeInfo) {}方法。

找到方法里这两句代码:
1:oldViewAnim.alpha(0).setListener(new VpaListenerAdapter() { ... }

2:newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).alpha(1).setListener(new VpaListenerAdapter() { ... }

替换成:
1:oldViewAnim.setListener(new VpaListenerAdapter() { ... }

2newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).setListener(new VpaListenerAdapter() { ... }

也就是说分别去掉上述代码中的alpha(0)和alpha(1),然后保存。这个时候基本就打工告成了。最后在自己的RecyclerView中进行如下调用mRecyclerView.setItemAnimator(new NoAlphaItemAnimator());,再跑起来,bug完美解决。




目录
相关文章
|
10月前
|
人工智能 索引 SEO
AI搜索时代GEO与SEO双螺旋理论的三层核心逻辑(收藏版)
陈欢,毕业于西南政法大学,悟空空科技CEO,深耕品牌营销十余年,AI搜索双螺旋理论创立者。兼具技术实力与企业品牌运营能力,服务过地产,滋补,微商,农产品等行业品牌。目前专注于:AI营销IP,AI智能体,AI律师营销等领域。服务企业运用ai实现降本80%,得到了企业客户与广大学员的一致好评。以实战案例输出硬核知识,助力品牌方在ai时代从内容到转化的深度转型升级。
|
4月前
|
人工智能 弹性计算 API
阿里云最新优惠券参考:AI加速季权益礼包、百炼优惠券、迁云补贴与学生优惠券领取与使用规则介绍
2026年阿里云推出多元化优惠券体系,覆盖学生、个人、企业及AI用户四大群体。个人与企业可领取AI加速季权益礼包(个人360元、企业1728元),覆盖百余款云产品,6月内一次性领用。AI大模型用户享百炼"先用后返"券,最高返200元。学生经认证可领300元无门槛年券,适用于ECS、OSS等主流产品。企业迁云最高可获5亿算力补贴,需提供非阿里云消费凭证申请。各券均有明确使用范围与有效期,建议用户按身份精准领取、合理规划使用,最大化降低上云与AI应用成本。
|
7月前
|
人工智能 自然语言处理 Cloud Native
2026企业级智能客服系统建设方案:大型企业高效建设智能客服系统方案指南,助力企业用好智能客服系统
2026年,客户体验成为企业价值起点。瓴羊Quick Service以“业服一体”架构、行业大模型赋能与人机协同闭环,助力大型企业构建从“成本中心”到“增长引擎”的智能客服体系,实现服务即经营、数据即资产。(239字)
|
10月前
|
数据处理 数据库 开发者
事务 ACID 特性
事务是确保数据库数据一致性和完整性的关键机制,具备ACID四大特性:原子性保证操作全成功或全回滚;一致性确保数据符合规则;隔离性防止并发干扰;持久性保障提交后数据不丢失。
|
NoSQL Linux Redis
每天百万访问也不怕,Redis帮你搞定UV统计
本文介绍了使用Redis实现高性能UV统计系统的方法。Redis凭借其内存数据库特性,支持毫秒级响应和自动去重,非常适合高并发场景下的访客统计。核心思路是利用Redis的Set数据结构作为"每日签到墙",通过记录用户访问ID实现自动去重,并设置24小时过期时间。文章提供了Python代码示例,展示如何记录用户访问和获取当日UV统计数据,还可扩展实现多页面UV统计。相比传统数据库方案,Redis方案更加轻量高效,是中小型网站实现流量统计的理想选择。
906 0
|
12月前
|
存储 运维 监控
《时序数据监控平台优化指南:从查询超时到秒级响应,指标下的存储与检索重构实践》
本文聚焦企业级时序数据监控平台优化,针对InfluxDB单节点在2500台设备、2亿条日均数据下的查询超时、存储成本失控、降采样数据丢失、多维度查询卡顿等问题,提出“分层存储+预计算降采样+索引重构”方案。按数据热度分热(7天内,Redis+SSD)、温(7-90天,SSD)、冷(90天以上,OSS)三层存储,搭配生命周期管理服务实现数据流转;按指标类型定制预计算聚合规则,减少查询计算量;通过复合哈希索引、标签字典编码、bitmap索引优化多维度检索。
397 3
|
IDE 安全 数据管理
Visual Basic for Applications (VBA):自动化Office任务
【4月更文挑战第27天】**Visual Basic for Applications (VBA)** 是Microsoft Office中的宏语言,用于自动化Excel、Word、Outlook等应用的任务。VBA基于Visual Basic,通过编写代码控制应用行为,提升效率。文章介绍了VBA环境、基础语法,展示了在Excel(数据处理)、Word(文档管理)和Outlook(邮件自动化)中的应用。强调安全性和调试重要性,学习VBA能增强Office软件的功能,实现高效自动化工作流程。
1087 0
|
SQL 缓存 关系型数据库
SQL为什么不建议执行多表关联查询
本文探讨了SQL中不建议执行多表关联查询的原因,特别是MySQL与PG在多表关联上的区别。MySQL仅支持嵌套循环连接,而不支持排序-合并连接和散列连接,因此在多表(超过3张)关联查询时效率较低。文章还分析了多表关联查询与多次单表查询的效率对比,指出将关联操作放在Service层处理的优势,包括减少数据库计算资源消耗、提高缓存效率、降低锁竞争以及更易于分布式扩展等。最后,通过实例展示了如何分解关联查询以优化性能。
640 0
|
机器学习/深度学习 存储 人工智能
【博士每天一篇文献-算法】Zero-Shot Machine Unlearning
这篇论文提出了零样本机器遗忘的概念,介绍了两种新方法——错误最小化-最大化噪声(Error Maximization-Minimization, M-M)和门控知识传输(Gated Knowledge Transfer, GKT),以实现在不访问原始训练数据的情况下从机器学习模型中删除特定数据,同时引入了Anamnesis指数来评估遗忘质量,旨在帮助企业有效遵守数据隐私法规。
573 3