Android ExpandableListView 使用动画

标签 android animation expandablelistview

我正在使用

<ExpandableListView
     android:id="@+id/listView"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >
</ExpandableListView>

我想在 onclick parent 时为 child 添加动画幻灯片。那我该怎么办?

最佳答案

最终更新

自从我写这个答案以来已经有一段时间了。从那以后发生了很多变化。最大的变化是引入了 RecyclerView,它使列表或网格的动画变得容易。如果可以的话,我强烈建议切换到 RecyclerViews。对于那些不能解决问题的人,我将了解我可以为我的库修复错误。


原答案

我实际上不喜欢动画 ExpandableListView 的流行实现,它只是使用带有展开动画的 ListView,因为在我的用例中,我的每个组都有很多 child ,因此使用普通 ListView 是不可行的因为 subview 不会被回收,内存使用量很大,性能很差。相反,我采用了一种更困难但更具可扩展性和灵 active 的方法。

我扩展了 ExpandableListView 类并覆盖了 onCollapse 和 onExpand 函数,我还创建了一个名为 AnimatedExpandableListAdapter 的 BaseExpandableListAdapter 的子类。在适配器内部,我覆盖了 getChildView 函数并使该函数成为最终函数,以便该函数不能再次被覆盖。相反,我为子类提供了另一个名为 getRealChildView 的函数来覆盖以提供真正的 subview 。然后,我在类中添加了一个动画标志,如果设置了动画标志,则 getChildView 返回一个虚拟 View ,如果未设置该标志,则返回真实 View 。现在有了舞台设置,我对 onExpand 执行以下操作:

  1. 在适配器中设置动画标志并告诉适配器哪个组正在扩展。
  2. 调用 notifyDataSetChanged()(强制适配器为屏幕上的所有 View 调用 getChildView())。
  3. 适配器(在动画模式下)然后将为初始高度为 0 的扩展组创建一个虚拟 View 。然后适配器将获取真正的 subview 并将这些 View 传递给虚拟 View 。
  4. 然后虚拟 View 将开始在它自己的 onDraw() 函数中绘制真正的 subview 。
  5. 适配器将启动一个动画循环,该循环将扩展虚拟 View 直到其大小合适。它还将设置一个动画监听器,以便在动画完成后清除动画标志并调用 notifyDataSetChanged()

最后,完成所有这些后,我不仅能够获得所需的动画效果,还可以获得所需的性能,因为这种方法适用于拥有 100 多个 child 的小组。

对于折叠动画,需要做更多的工作才能完成所有设置和运行。特别是,当您覆盖 onCollapse 时,您不想调用父函数,因为它会立即折叠组,让您没有机会播放动画。相反,您想在折叠动画结束时调用 super.onCollapse。

更新:

这个周末我花了一些时间来重写我对这个 AnimatedExpandableListView 的实现,我在这里发布了一个示例用法的源代码: https://github.com/idunnololz/AnimatedExpandableListView/

关于Android ExpandableListView 使用动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20627113/

相关文章:

wpf - StopStoryboard 不会...停止 BeginStoryboard

android - Expandablelistview 子项上的 ImageButton

java - 单击展开 ListItem 到新 View

ios - 如何制作一个可扩展的 tableview 来显示 iOS 的其余细节?

android - 将表情符号(表情符号图像)嵌入自定义软键盘android

android - android :isScrollContainer do? 是什么意思

android - 动画列表最初没有动画

javascript - 如何实现jQuery动画排队?

Android 如何使用 MediaScannerConnection 扫描文件

android - 从WebView获取网站源码