android - 在 RecyclerView 的 ItemAnimator 上禁用 onChange 动画

标签 android android-recyclerview android-support-library

我正在使用一个 RecyclerView,它使用 SortedListAdapterCallbackSortedList 中获取数据。我想为 onChange 事件禁用动画,但为 onInserted/onRemoved/onMoved 保留它们。我尝试在 RecyclerView 使用的 DefaultItemAnimator 上调用 setSupportsChangeAnimations(false),但动画仍然出现。如果我调用 setItemAnimator(null) 所有 动画都会按预期成功删除。

我试着查看实现,似乎如果 supportsChangeAnimationstrueRecyclerView 将通过保留旧的 viewHolder 来动画更改事件并将其交叉淡化到新的 viewHolder。我不想要那个。如果 supportsChangeAnimationsfalse,则新旧 viewHolder 将是同一个对象,并且将有一个从 x 到 x 的 onMoved 动画(即没有实际移动)。然而,这意味着该项目将获得恼人的弹跳效果。我也不想要那个,我根本不想要动画。 :(

来自 DefaultItemAnimator.java:

@Override
public boolean animateChange(ViewHolder oldHolder, ViewHolder newHolder,
        int fromX, int fromY, int toX, int toY) {
    if (oldHolder == newHolder) {
        // Don't know how to run change animations when the same view holder is re-used.
        // run a move animation to handle position changes.
        return animateMove(oldHolder, fromX, fromY, toX, toY);
    }
    ...

有时,当我加载我的列表时,我会异步获取一些数据并更新项目 1-3 次,每次它跳动和闪烁时看起来真的很糟糕。

如何在不编写完全自定义的 ItemAnimator 的情况下有效地完全禁用 onChange 动画?

最佳答案

我参加这个聚会有点晚了,但是使用 androidx.recyclerview:recyclerview:1.1.0 我可以设置更改默认动画师的 changeDuration 到 0 这会有效地禁用动画,同时允许添加/移动/删除动画继续正常运行。无需自定义覆盖 DefaultItemAnimator

示例(在 Kotlin 中):

view.my_recycler_view.itemAnimator?.changeDuration = 0

关于android - 在 RecyclerView 的 ItemAnimator 上禁用 onChange 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35766497/

相关文章:

android - 支持库版本更改时无法解析符号

android.support.v4.app.ListFragment 只是不显示

android - 创建Android背景,多少像素?

java - 尝试用一种方法重命名录制的文件

java - 单击按钮时如何将数据从适配器传递到主 Activity

android - 使用 GridLayoutManager 将项目粘贴到 RecyclerView 的底部

android - 使用 TextInputLayout 时更改 EditText 提示颜色

android - 如何在 android 中使用 webview 显示的 html 文件中拖动图像?

android - 开始 Activity 后立即调用 OnPause 和 OnStop()

kotlin - 如何在 kotlin 中单击 recyclerview 项目内的按钮