RecyclerView notifyItem闪烁的问题

之前我们做点赞,用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完美解决。

时间: 2024-08-04 12:21:33

RecyclerView notifyItem闪烁的问题的相关文章

那年的RecyclerView我们从头撸一下

本文讲的是那年的RecyclerView我们从头撸一下,根据Google官方给出的说明:A flexible view for providing a limited window into a large data set.能够在有限的窗口中展示大数据集合的灵活视图. 所以我们能够理解为,RecyclerView的一个恰当的使用场景是:由于尺寸限制,用户的设备不能一次性展现所有条目,用户需要上下滚动以查看更多条目.滚出可见区域的条目将被回收,并在下一个条目可见的时候被复用. 对于减少内存开销和

[译]Workcation App – 第四部分. 场景(Scenes)和 RecyclerView 的共享元素转场动画(Shared Element Transition)

本文讲的是[译]Workcation App – 第四部分. 场景(Scenes)和 RecyclerView 的共享元素转场动画(Shared Element Transition), 原文地址:Workcation App – Part 4. Shared Element Transition with RecyclerView and Scenes 原文作者:Mariusz Brona 译文出自:掘金翻译计划 译者:龙骑将杨影枫 校对者:张拭心.Feximin Workcation App

[译]Workcation App – 第三部分. 带有动画的标记(Animated Markers) 与 RecyclerView 的互动

本文讲的是[译]Workcation App – 第三部分. 带有动画的标记(Animated Markers) 与 RecyclerView 的互动, 原文地址:Workcation App – Part 3. RecyclerView interaction with Animated Markers 原文作者:Mariusz Brona 译文出自:掘金翻译计划 译者:龙骑将杨影枫 校对者:Vivienmm.张拭心 Workcation App – 第三部分. 带有动画的标记(Animate

Android在滚动列表中实现视频的播放(ListView & RecyclerView)

英文原文:Implementing video playback in a scrolled list (ListView & RecyclerView)  本文将讲解如何在列表中实现视频播放.类似于诸如 Facebook, Instagram 或者 Magisto这些热门应用的效果: Facebook: Magisto: Instagram: 这片文章基于开源项目: VideoPlayerManager. 所有的代码和示例都在那里.本文将跳过许多东西.因此如果你要真正理解它是如何工作的,最好下

Win8系统开机后鼠标光标不停闪烁无法正常输入文字的解决方法

Win8系统开机后鼠标光标不停闪烁无法正常输入文字的解决方法  故障原因分析: 应该是鼠标硬件出现问题了. 解决方法: 1.更换其他鼠标,如果恢复正常说明是鼠标的问题. 2.同一个鼠标接入不同电脑,如果还是遇到同样的问题,那就可以确认是鼠标的故障,建议更换鼠标. 3.如果确认鼠标没有问题,建议更换一个插口再试试. 以上就是Win8鼠标光标不停闪烁无法正常输入文字的解决方法,这种情况还有可能是鼠标接触不良,重新插拔一下就可以了,希望能够帮助到大家.

Google 相册风格的RecyclerView多选效果: drag-select-recyclerview

Google 相册风格的RecyclerView多选效果,手指滑动所到之处都被选中.不过与谷歌相册的差距是一次只能选择一屏的item. Gradle依赖   build.gradle 文件:  repositories { // ... maven { url "https://jitpack.io" } } dependencies { // ... compile('com.afollestad:drag-select-recyclerview:0.1.0@aar') { tran

Photoshop制作星光闪烁的磨砂字体动画教程

  Photoshop制作星光闪烁的磨砂字体动画教程          教程主要使用Photoshop制作星光闪烁的磨砂字体动画教程,前几天的动态文字教程,有同学反映操作有难度,今天来一篇比较容易上手的.很多新手不理解的动画原理方面,作者也特意挑出来讲,生动贴切,通俗易懂,一学即会.素材跟源文件都给备好了,就等涨姿势了. 打开PS,新建一个文档.文档大小我选用600px*800px.新建成功后,选用渐变工具,沿着画笔的对角线画出一个直线渐变背景.色值从#0a485a过渡到#1180a0. 这里的

recyclerview json-三生大侠 猪猪侠 代码在这里

问题描述 三生大侠 猪猪侠 代码在这里 import android.app.Activity;import android.content.Context;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.widget.DefaultItemAnimator;import android.support.v7.widget.RecyclerView;import android.supp

Photoshop制作闪烁的霓虹灯文字

这个实例结合Photoshop和Imageready制作了一个霓虹灯文字闪烁的漂亮效果,主要用到高斯模糊滤镜,先看下效果吧: 制作步骤: 1.新建一个宽500像素,高350像素的文件,将背景填充为黑色. 2.选择文字工具,打上自己喜欢的文字,设置一个喜欢的字体和合适的大小,颜色不限. 3.按住Ctrl键在图层面板单击文字图层载入其选区,新建一个图层,执行编辑/描边,颜色为红色. 4.删除文字图层,Ctrl J复制图层1得到图层1副本. 5.选择图层1副本,执行滤镜/模糊/高斯模糊1个像素左右.