我正在构建一个由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"
添加到所有元素,没有帮助
答案 0 :(得分:0)
不确定是否适合您的问题约束,但是您不必手动设置扩展/折叠动画。 RecyclerView可以通过在适配器中正确使用//2
开箱即用地为您提供此功能。
ls | grep '2018-08-22' | xargs -I '{}' cp '{}' ~/data/lidar/tmp-ajp2/
以上代码删除了动画逻辑,而是每次单击CardView时都调用notifyItemChanged()
。这告诉RecyclerView在特定位置重新渲染该项目,并为您免费提供重新渲染的动画。