RecyclerView 项目的 Android 动画问题

标签 android animation android-recyclerview kotlin

我在回收 View 中的某些按钮项上添加了点击动画。

一切顺利,但是当我向下滚动列表时,一些按钮出现在奇怪的状态,就像它们在动画阶段被卡住一样,即使没有为这些按钮触发动画,而对于其他按钮,它们的 View 设置为不可见/走了。

这是收缩动画代码的一部分,其中收缩是一个ValueAnimator对象。

shrink.addUpdateListener { animation ->
        val animatedValue = animation.animatedValue as Int
        v.layoutParams.width = animatedValue
        v.requestLayout()
    }
    shrink.addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationStart(animation: Animator) {
            super.onAnimationStart(animation)
            v.visibility = View.VISIBLE
            v.isEnabled = false
        }
        override fun onAnimationEnd(animation: Animator) {
            super.onAnimationEnd(animation)
            v.layoutParams.width = 0
            v.visibility = View.GONE
            v.isEnabled = false
        }
   }

我有一个 ViewViewHolder 类,我在其中绑定(bind)滚动时回收 View 项的可见性。

我在动画生命周期中是否遗漏了与回收 View 项目一起工作的步骤?我在想也许我必须处理 onAnimationStoponAnimationPause 情况,但我不确定。

如有任何帮助,我们将不胜感激。

最佳答案

我认为你的问题的原因是当你滚动时 View 被回收了。如果在 View 上触发动画并且滚动列表,动画将继续,但在某些时候, View 会被回收并重新填充,这会导致奇怪的状态。

解决方案是取消动画并在适配器的 onBindViewHolder 方法中将初始状态设置为 View 。 我将针对您的情况执行的步骤:

  1. 将您的值(value)动画师链接到 View 持有者,因此每个 View 持有者都有自己的值(value)动画师。
  2. 像现在一样触发动画,使用 View 持有者的局部值动画器。
  3. > Cancel你的值(value)动画师 onViewRecycled
  4. onBindViewHolder将 View 的可见性明确设置为可见,启用它并设置全宽。

关于RecyclerView 项目的 Android 动画问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50363254/

相关文章:

java - 从数据库重新加载列表或将其存储为 Parcelable?

android - Recyclerview item点击波纹效果

android - 将水平 RecyclerView 作为项目放置在垂直 RecyclerView 中时的自动滚动问题

android - 在 WebView 中播放 .mp4

android - 将包从 Android list 移动到构建文件

java - 意外的 token : position text in java input stream reader

ios - 使用 POP 框架的 UIView 动画在同一操作中放大和缩小

android - RecyclerView 裁剪底部数据

javascript - 当在视口(viewport)上可见时,在链中延迟 CSS 动画

javascript - CSS 动画播放状态问题 : Animation jumps back to initial frame when resumed?