RecyclerView中的展开视图无法正确设置动画

时间:2018-08-17 13:32:05

标签: android xml animation android-recyclerview kotlin

我正在构建一个由CardViews内的多个RecyclerView组成的UI。

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView
    android:id="@+id/card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardCornerRadius="5dp"
    app:cardElevation="1dp"
    app:cardBackgroundColor="#ddffca"
    android:animateLayoutChanges="true"
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:padding="10dp"
    >
    <TextView
        android:id="@+id/tvHello"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:text="Hello there!"
        />

  <TextView
      android:id="@+id/test"
      android:layout_width="wrap_content"
      android:layout_height="50dp"
      android:visibility="gone"
      android:gravity="center"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@id/tvHello"
      android:text="GENERAL KENOBI!"
      />
</android.support.constraint.ConstraintLayout>
  </android.support.v7.widget.CardView>

在内部,我已经指定在点击时甚至会动画显示test文字。效果很好,我对结果感到满意。但是,一旦我在RecyclerView中添加了几张卡片,动画就会开始变得有些奇怪。我的意思是,考虑到其他视图已更改其大小,未触摸的视图未设置适当的动画效果。相反,我看到另一个视图没有任何动画就跳到了新位置。 如何根据其他视图设置动画?

编辑 我还提供了onBindViewHolder中的代码。不过在科特林:

override fun onBindViewHolder(
    holder: OperationsViewHolder,
    position: Int
  ) {

    var card: CardView = holder.cardView
    card.setOnClickListener {
      if (!operations.get(position).selected!!) {
        ObjectAnimator.ofFloat(card, "translationZ", 1f, 10f)
            .start()
        holder.test.visibility = View.VISIBLE;
        operations.get(position)
            .selected = true
      } else {
        ObjectAnimator.ofFloat(card, "translationZ", 10f, 1f)
            .start()
        holder.test.visibility = View.GONE;
        operations.get(position)
            .selected = false
      }

    }
  }

编辑2 我也尝试将android:animateLayoutChanges="true"添加到所有元素,没有帮助

1 个答案:

答案 0 :(得分:0)

不确定是否适合您的问题约束,但是您不必手动设置扩展/折叠动画。 RecyclerView可以通过在适配器中正确使用//2开箱即用地为您提供此功能。

 ls | grep '2018-08-22' | xargs -I '{}' cp '{}' ~/data/lidar/tmp-ajp2/

以上代码删除了动画逻辑,而是每次单击CardView时都调用notifyItemChanged()。这告诉RecyclerView在特定位置重新渲染该项目,并为您免费提供重新渲染的动画。