android 如何使用对象动画为项目的背景颜色在ClosclerView?

cwxwcias  于 2024-01-04  发布在  Android
关注(0)|答案(2)|浏览(172)

我有一个RecyclerView,当一些项目出现在屏幕上时,它们的背景颜色应该从粉红色动态地变为透明6秒。
问题是,除了那些应该改变背景颜色的项目外,直到主项目的6秒动画结束,其他一些项目的背景颜色也会改变。而当6秒结束时,所有项目的背景颜色都将是透明的。

  1. override fun onBindViewHolder(holder: Holder, position: Int) {
  2. val item = getItem(position)
  3. if (item.hasFade) {
  4. item.hasFade = false
  5. val colorFade = ObjectAnimator.ofObject(holder.itemView, "backgroundColor", ArgbEvaluator(), 0x32E91E63, Color.TRANSPARENT)
  6. colorFade.duration = 6000L
  7. colorFade.start()
  8. } else {
  9. itemView.background = null
  10. }
  11. }

字符串

u0njafvf

u0njafvf1#

您面临的问题是,当ViewHolder被回收时,它保留了以前使用的项目的属性,因此,如果需要动画的项目被绑定到ViewHolder,然后这个ViewHolder被回收用于不需要动画的项目,它仍然会显示动画。
因此,要解决这个问题,您需要确保在onBindViewHolder方法的else块中重置itemView的背景颜色。
您的程式码应该看起来像这样:

  1. override fun onBindViewHolder(holder: Holder, position: Int) {
  2. val item = getItem(position)
  3. if (item.hasFade) {
  4. item.hasFade = false
  5. val colorFade = ObjectAnimator.ofObject(holder.itemView, "backgroundColor", ArgbEvaluator(), 0x32E91E63, Color.TRANSPARENT)
  6. colorFade.duration = 6000L
  7. colorFade.start()
  8. } else {
  9. holder.itemView.setBackgroundColor(Color.TRANSPARENT)
  10. }
  11. }

字符串

展开查看全部
6g8kf2rb

6g8kf2rb2#

滚动时会重复使用ClerView项目。请尝试在onBindView保持器方法的开头调用保持器.setIsRecyclable(false)以防止重复使用项目。然后将侦听器添加到动画(colorFade. addView)并覆盖侦听器中的onAnimationEnd方法。在内部调用保持器.setIsRecyclable(true)以允许在动画完成时回收项目。

相关问题