当前位置: 首页 > 知识库问答 >
问题:

重写RecyclerView.Adapter中notifyItemChanged的动画

司空海荣
2023-03-14

好吧,我有一个带有适配器的RecyclView,一切都很好。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,有人有一个简单的例子吗?

提前致谢!

共有3个答案

晏卓君
2023-03-14

尝试设置:

mRecyclerview.setItemAnimator(null);
冀崇凛
2023-03-14

是的,我有。

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

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() { ... }
高宇定
2023-03-14

有一个专门的方法来禁用只是项目更改动画:

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

官方文档。

 类似资料:
  • 我的RecyclView defaultItemAnimator有问题。当我使用elle fyItemRemve()删除我的一个项目时,我还会在另一个特定索引上调用elle fyItemChanged()来更改其中的文本。在删除动画期间,我在其上调用的项目通知fyItemChanged()会更改其文本,但会做一些看起来很傻的动画,像拇指疼痛一样突出。(它会立即移动到新位置,而其余的则会顺利移动到新

  • 我试图做一个重写,如果页面不存在,它重写到一个类别页面。它与普通的ReWriteCond%{REQUEST_FILENAME}-f有点不同,因为页面名称是基于URL动态的。 如果有人访问动态路径名称,如“/联系人” 我首先希望它检查以下文件夹/文件是否存在基于路径名称: 例如: 如果不存在,重写到以下页面 例如: 我已经尝试了下面的方法,但是当文件存在并直接进入类别重写时,第一个重写规则触发失败。

  • 首先,我在这方面工作了一整天,但什么也做不到。我有一个,其适配器使用的。我尝试使用回调类实现: 下面是TouchHelper的初始化 我的适配器实现接口 链接 适配器类查看器类

  • 我在类A中创建了两个方法,并在类B中重写,如下所示。我有一些关于动态多态性和重写的问题。 重写和动态多态总是同时发生吗?

  • 我正在使用RecyclerView来显示一个项目列表,我需要按位置更新单个项目的状态。我正在更新列表中的项目,然后调用notifyItemChanged(int位置),如下所示: 项目更新成功,但也随机更新了一些其他项目,每次我滚动上下通过我的项目列表,这种更新(不同的图标状态)也在其他项目上。

  • 问题内容: 覆盖和过载之间有什么区别? 问题答案: 重载:在编译时根据指定参数的数量和类型选择方法 签名 覆盖:在执行时根据目标对象的实际类型(与表达式的编译时类型相对)选择方法 实现 例如: 这两个调用都是 重载的 示例。有两种方法,称为,编译器确定要调用的签名。 第一次调用是 覆盖 的示例。编译器选择签名“ foo(int)”,但是在执行时,目标对象的类型确定要使用的实现应为in中的一个。