在RecyclerView.Adapter

时间:2015-08-08 18:59:04

标签: android android-recyclerview

好吧,我有一个带适配器的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 个答案:

答案 0 :(得分:85)

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

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

Official docs

答案 1 :(得分:22)

是的,我做到了。

首先,获取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() { ... }

答案 2 :(得分:8)

尝试设置:

mRecyclerview.setItemAnimator(null);

答案 3 :(得分:7)

Kotlin @Pablo A. Martínez回答:

(recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false

答案 4 :(得分:3)

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

我没有完全删除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 这样可以消除与alpha相关的闪烁完全变为0,但保持项目变形动画的变形质量。

答案 5 :(得分:2)

如果您只是修改Recyclerview的数据意味着没有添加或删除项目,那么您应该添加此行。

mRecyclerview.setHasFixedSize(true); 

因此,在您可以申请

后,recyclerview将会知道大小没有变化
((SimpleItemAnimator) mRecyclerview.getItemAnimator()).setSupportsChangeAnimations(false);

因此,动画将消失,代码将像魅力一样工作:)

答案 6 :(得分:0)

在我的情况下,recyclerview占据了工具栏下方的所有空间。我所做的只是将recyclerview的layout_height从wrap_content更改为match_parent并且闪烁消失。