android-在RecyclerView.Adap中重写notifyItemChanged的动画

好吧,我有一个带适配器的RecyclerView,一切正常。 ArrayList数据集中的项目会定期更新。 因此,项目及其元素以及它们在列表中的位置都会发生变化。 只要发生任何事情,就可以通过简单的排序并手动调用这些方法来实现:

// swapping two items

Collections.swap(items, i, j);

itemsAdapter.notifyItemMoved(i, j);

// adding a new one

itemAdapter.notifyItemInserted(items.size());

// when updating valus

itemAdapter.notifyItemChanged(i);

后者是我痛苦的原因。 每次更新项目时,都会触发一点“闪烁”动画。

我找到了一些解决方案:

// disabling all animations

recyclerView.getItemAnimator().setSupportsChangeAnimations(false);

// or

// setting the animation duration to zero,

recyclerView.getItemAnimator().setChangeDuration(0);

但是当物品移动(被交换)时,这两个都会杀死动画。 我只想覆盖一个动画并保留所有这些魔术。 有办法吗? 而且,如果它覆盖了ItemAnimator,那么有人能举一个简单的例子吗?

提前致谢!

7个解决方案

94 votes

有一种专用方法可以禁用仅更改了项目的动画:

((SimpleItemAnimator) myRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

官方文档。

Pablo A. Martínez answered 2020-01-10T03:06:54Z

22 votes

是的,我做到了。

首先,获取DefaultItemAnimator的源代码。 使用代码并在项目中创建一个名为MyItemAnimator的类。 然后,将ItemAnimator设置为修改后的MyItemAnimator的新实例,如下所示:

recyclerView.setItemAnimator(new MyItemAnimator());

现在,进入新的类源代码并找到方法

animateChangeImpl(final ChangeInfo changeInfo) { ... }

我们只需要找到更改Alpha值的方法调用即可。 找到以下两行,然后删除.alpha(0)和.alpha(1)

oldViewAnim.alpha(0).setListener(new VpaListenerAdapter() { ... }

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

像这样

oldViewAnim.setListener(new VpaListenerAdapter() { ... }

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

Alex answered 2020-01-10T03:07:32Z

10 votes

尝试设置:

mRecyclerview.setItemAnimator(null);

box answered 2020-01-10T03:07:52Z

8 votes

@PabloA.Martínez的Kotlin版本答案:

(recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false

MBH answered 2020-01-10T03:08:12Z

3 votes

亚历克斯的答案略有不同。

我没有完全删除Alpha更改,而是减少了更改。 唯一需要的更改是:

//changed alpha from 0

ViewCompat.setAlpha(newHolder.itemView, 0.5f);

//changed alpha from 0

oldViewAnim.alpha(0.5f).setListener(new VpaListenerAdapter() {

在两种情况下,都将0更改为0.5这具有消除与完全变为0的Alpha相关的闪烁的效果,但保留了项目更改动画的变形品质。

Deefer answered 2020-01-10T03:08:45Z

2 votes

如果您仅修改Recyclerview的数据,则意味着没有添加或删除项目,则应添加此行。

mRecyclerview.setHasFixedSize(true);

这样,您可以申请后,recyclerview会知道尺寸没有变化

((SimpleItemAnimator) mRecyclerview.getItemAnimator()).setSupportsChangeAnimations(false);

这样动画就消失了,代码也可以像魅力一样工作了:)

Keyur Lakhani answered 2020-01-10T03:09:14Z

0 votes

就我而言,recyclerview占用了工具栏下面的所有空间。 我所做的就是将recyclerview的layout_height从wrap_content更改为match_parent,并且闪烁消失了。

Code4Fun answered 2020-01-10T03:09:34Z

android重写item,android-在RecyclerView.Adap中重写notifyItemChanged的动画相关推荐

  1. android content item,Android中ContentProvider的应用实例

    一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方 ...

  2. android gridvie item,Android开发―解决自定义GridView高度第一个item高度异常问题

    问题描述: 在写之前,先把问题的图贴出来,问题如下图,GridView的第一个item的自定义高度显示不正常(再次加载之后又正常),不是预设的高度: 解决方法: 首先需要申明,这个GridView 的 ...

  3. java哪些类重写equals方法_Java自定义类中重写equals方法

    equals方法的要求: a.自反性:对于任何非空的x,x.equals(x)都应该返回true b.对称性:对于任何引用x和y,当且仅当x.equals(y)返回true时,y.equals(x)也 ...

  4. Android添加item动画,RecyclerView基础篇-Item添加动画

    Android_Banner.jpg 简介 本节中我们介绍下给RecyclerView中的Item添加动画. 添加的动画,分为,在打开列表时有Item的展示动画,当滑动的时候没有动画 和打开列表滑动时 ...

  5. android listview替代,Android笔记——RecyclerView替代ListView

    ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...

  6. android recyclerview,AndroidRecyclerView中的Item嵌套RecyclerView使用实例

    最近项目中有一个需求是RecyclerView中的Item中嵌套RecyclerView,在网上没找到什么资料,然后就自己尝试了一下. 首先看一下效果图 录制GIF现在不大方便,就直接上两个图了. 关 ...

  7. 【Android 界面效果49】RecyclerView高度随Item自适应

    编写RecyclerView.ItemDecoration时,在onDraw方法中,Drawable的高度等于RecyclerView的高度减去RecyclerView的上下padding. @Ove ...

  8. android调小边框距离,RecyclerView Item 的分割线 距边框距离问题总结

    哈, 首先  今天Design 提了一个需求,废话少说~~! 上图android 分割线 在中间显示,距离左边 边距是66px 右边依然是66px.ios 刚开始接到这个需求,感受还阔以,挺简单的,可 ...

  9. Android Material Design之在RecyclerView中嵌套CardView实现

    前言: 第一眼就爱上了Android的Material Design风格.以前倒对Android的界面风格不那么喜欢,扁平化的界面设计真是好看. 其实,这个嵌套操作在实现上并没有什么难点.可是,我还在 ...

最新文章

  1. 加速产业生态算力升级,华为鲲鹏展翅福州
  2. Git在windows环境下的使用教程
  3. subd计算机系统结构,计算机体系结构第2章试题答案.doc
  4. 神经网络核心基础:MP Model
  5. Android学习小Demo(14)Android中关于PopupWindow的使用
  6. JAVA反射系列之Method,java.lang.reflect.Method的使用。
  7. 基于 TI 方案 CC2540 低功耗无线蓝牙模块详解
  8. MES系统是什么?MES系统的操作流程是怎样?
  9. 全网最详细的排列组合系列算法题整理
  10. optimizer.zero_grad(), loss.backward(), optimizer.step()的理解及使用
  11. Java,Scala:JDBCUtil,MySqlUtil,PhoenixJDBC
  12. 51单片机定时/计数器的工作原理
  13. XMind8.0介绍与安装(破解)
  14. Qt样式表使用总结3,我常用的选色方法
  15. 拓嘉恒业:拼多多开店条件分享
  16. 如何用Java实现图片的无缝连接循环滚动
  17. CGAL:学习CGAL
  18. Lotus Notes中文档查询(转)
  19. 用JS实现的完美无限级联下拉菜单
  20. Hu矩---OpenCV-Python开发指南(26)

热门文章

  1. 固态硬盘科普:SSD是怎么「开卡」的?
  2. RabbitMQ快速入手(docker版)
  3. 林氏木业亮相广州建博会,迎接全屋定制新风口
  4. 神奇的小石子 dfs(深搜) 考核补题
  5. 关于%取余的一些知识
  6. 一通百通之Linux加载库文件
  7. 做什么职业,也别做程序员,尤其是java程序员(转载)
  8. Unity 立体3D VR的实现
  9. 基于MySQL进行留存率的计算
  10. 学习笔记---Git