【问题标题】:Can I use MotionLayout to animate individual items inside RecyclerView?我可以使用 MotionLayout 为 RecyclerView 中的单个项目设置动画吗?
【发布时间】:2019-08-18 08:43:43
【问题描述】:

我想在 recyclerview 中创建可扩展的项目,我认为使用 MotionLayout 来创建动画会非常简单。我创建了运动场景并测试了当在回收站视图中视图不会动画时,单个项目可以独立工作。

我尝试显示所有调试信息,它说正在发生转换,但 recyclerview 没有显示任何动画。我尝试通知 item animator 动画已在我的视图中开始,但没有奏效。

override fun onTransitionStarted(p0: MotionLayout?, p1: Int, p2: Int) {
  recyclerView.itemAnimator?.onAnimationStarted(this@ViewHolder)
}
override fun onTransitionCompleted(p0: MotionLayout?, p1: Int) {
  recyclerView.itemAnimator?.onAnimationFinished(this@ViewHolder)
}

我预计 motinolayout 状态转换会在 recyclerview 中起作用,但它们似乎不起作用。

单个列表项:

内部清单:

【问题讨论】:

  • 您是否能够保留 MotionLayout 并为项目调整大小设置动画?还是您将其删除并使用 notifyItemChanged() 作为下面的答案解释?想知道 bc 我在我的项目上尝试展开/折叠动画,但同样的问题
  • @Crono 我最终放弃了 MotionLayout 以展开/折叠。接受的答案对我来说似乎很好。我采用了一个解决方案,我使用RecyclerView.ListAdapter 并让我的改编对象在其中包含展开/折叠的信息。然后当用户点击一个列表项时,甚至会导致一个新列表的发射,随着列表项属性的变化,通过ListAdapter魔术,更改的项目将动画,而无需我调用notifyItemChanged

标签: android android-recyclerview android-animation android-motionlayout


【解决方案1】:

我想在 recyclerview 中创建可扩展的项目,我认为使用 MotionLayout 创建动画会非常简单。

RecyclerView 中使用MotionLayout 来实现简单的展开动画是多余的,您只需在RecyclerView Adapter onBindViewHolder 上使用简单的视图/隐藏即可获得相同的动画。然后,当您想要展开/折叠时,只需使用位置调用notifyItemchanged。这将节省您的一天。干杯!

在 RecyclerView 适配器内部,

holder.itemView.setOnClickListener(v -> {
    // Get the current state of the item
    boolean expanded = item.isExpanded();
    // Change the state
    item.setExpanded(!expanded);
    // Notify the adapter that item has changed
    notifyItemChanged(position);
});

【讨论】:

  • 这可能是 StackOverFlow for Android 和 RecyclerView 上最好的答案之一。
【解决方案2】:

尝试将您的 ConstraintLayout 更新为 androidx.constraintlayout:constraintlayout:2.0.0-rc1 似乎这个包已修复,以及 RecyclerView androidx.recyclerview:recyclerview:1.2.0-alpha05

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多