AnimatedExpandableListView 完全入门:30秒为Android应用加上丝滑展开折叠动画
2026/8/22 12:33:22 网站建设 项目流程

AnimatedExpandableListView 完全入门:30秒为Android应用加上丝滑展开折叠动画

【免费下载链接】AnimatedExpandableListViewAn extendable, flexible ExpandableListView widget that supports animations.项目地址: https://gitcode.com/gh_mirrors/an/AnimatedExpandableListView

📌AnimatedExpandableListView是一个专为 Android 打造的可展开折叠列表动画控件,它是原生ExpandableListView的增强版:点击分组即可播放丝滑的展开/折叠过渡动画。如果你受够了系统默认"瞬间弹出"的突兀效果,这个开源控件只需 3 步接入,就能让你的应用拥有 App Store 级交互体验。

为什么需要这个展开折叠动画控件?

Android 原生的ExpandableListView功能强大,但有个明显的短板:展开和折叠没有任何过渡动画——子项要么瞬间出现,要么瞬间消失,观感非常生硬。

AnimatedExpandableListView 正是为解决这个问题而生。它在完全保留原生ExpandableListView用法的基础上,额外提供了两个带动画的方法,让列表的展开折叠动画变得平滑自然,整个过程仅需约 300 毫秒。

30秒上手:3步接入步骤

第1步:获取项目源码

在终端中执行以下命令克隆仓库:

git clone https://gitcode.com/gh_mirrors/an/AnimatedExpandableListView

将核心控件源码复制到你的项目中,核心文件只有一个:

  • 控件源码:src/com/idunnololz/widgets/AnimatedExpandableListView.java

第2步:在布局文件中替换控件

打开布局 XML,把原来的<ExpandableListView>直接换成带包名的自定义控件即可,属性写法完全不变。可以参考示例布局res/layout/activity_main.xml,核心就是一行标签:

<com.idunnololz.widgets.AnimatedExpandableListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" />

分组行和子项行的样式分别由res/layout/group_item.xmlres/layout/list_item.xml定义,你可以随意改成自己的 UI。

第3步:让 Adapter 继承专用基类

这一步是关键:你的列表适配器必须继承AnimatedExpandableListAdapter(它是AnimatedExpandableListView内部定义的静态抽象类,位于 src/com/idunnololz/widgets/AnimatedExpandableListView.java 中)。

与普通 Adapter 相比,只需把两个方法改个名:

原 Adapter 方法改名为
getChildView(...)getRealChildView(...)
getChildrenCount(...)getRealChildrenCount(...)

完整写法可直接参考示例代码:src/com/example/animatedexpandablelistview/MainActivity.javaExampleAdapter类)。

两个核心方法:展开与折叠动画

给列表绑定了 Adapter 后,只需注册一个分组点击监听,根据当前状态调用对应方法即可——这就是 30 秒内完成全部接入的原因:

方法作用源码位置
expandGroupWithAnimation(int)播放展开动画AnimatedExpandableListView.java
collapseGroupWithAnimation(int)播放折叠动画AnimatedExpandableListView.java
listView.setOnGroupClickListener(new OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { if (listView.isGroupExpanded(groupPosition)) { listView.collapseGroupWithAnimation(groupPosition); // 折叠动画 } else { listView.expandGroupWithAnimation(groupPosition); // 展开动画 } return true; } });

💡 示例中用 100 个分组、每组最多 100 个子项做了压力测试,可见动画在长列表下依然流畅稳定。

原理速览:300ms 动画是怎么实现的?

🧠 这个控件的巧妙之处在于"借位":

  1. 调用展开方法后,控件通知 Adapter 进入动画模式,并真正执行expandGroup刷新列表;
  2. 此时 Adapter 不返回真实的子项视图,而是返回一个占位视图(DummyView),由它负责绘制出所有子项的画面;
  3. 对这个占位视图做高度从 0 到目标高度的插值动画(时长由ANIMATION_DURATION = 300毫秒控制,见 AnimatedExpandableListView.java);
  4. 动画结束后退出动画模式,列表刷新为真实视图——用户看到的就是一次完整的展开折叠动画。

折叠动画则是先播放高度归零的过程,结束后再真正调用collapseGroup。控件还做了大量边界处理:分组在屏幕外时自动跳过动画、动画中途反向切换会从中断高度继续、长列表会估算高度避免卡顿。

项目文件结构一览

🗂️ 整个项目非常轻量,核心文件一览:

  • src/com/idunnololz/widgets/AnimatedExpandableListView.java—— 控件 + Adapter 基类 + 动画实现(全部核心逻辑)
  • src/com/example/animatedexpandablelistview/MainActivity.java—— 完整使用示例
  • res/layout/activity_main.xml—— 布局接入示例
  • res/layout/group_item.xml/res/layout/list_item.xml—— 分组行与子项行样式
  • res/values/res/values-sw600dp/res/values-sw720dp-land/—— 多屏幕适配资源
  • AndroidManifest.xml—— 应用配置

常见问题 FAQ

Q:可以用普通的 BaseExpandableListAdapter 吗?A:不行。setAdapter时会强制检查类型,必须继承AnimatedExpandableListAdapter,否则抛出ClassCastException

Q:动画时长能调整吗?A:可以。时长由源码中的ANIMATION_DURATION常量(默认 300ms)控制,复制源码后自行修改即可。

Q:点击分组没有任何反应?A:确认两点——① Adapter 已继承AnimatedExpandableListAdapter;② 使用了expandGroupWithAnimation/collapseGroupWithAnimation而不是原生的expandGroup/collapseGroup

Q:适合什么场景?A:设置页、FAQ 帮助、商品分类、目录导航等一切"分组 + 子项"结构的界面,都是 Android 展开折叠动画的理想用武之地。


🎉 总结:AnimatedExpandableListView 用单个 Java 文件就补齐了原生列表控件最缺的一块——展开折叠动画。三步接入、方法改名、监听点击,30 秒让你的 App 交互体验立刻上一个台阶。

【免费下载链接】AnimatedExpandableListViewAn extendable, flexible ExpandableListView widget that supports animations.项目地址: https://gitcode.com/gh_mirrors/an/AnimatedExpandableListView

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询