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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值