是否可以为 expandableListView 应用展开或折叠动画?
3 回答
它可以使用一个简单的 ListView 来完成,该 ListView 包含一个最初隐藏的视图和一个扩展 Animation 的自定义类。基本思想是开始,View.GONE
然后逐渐将边距从负值重新调整到所需大小,同时将可见性设置为View.VISIBLE
.
看:
- https://github.com/tjerkw/Android-SlideExpandableListView
- Android 动画:隐藏/显示菜单
- 如何为 View.setVisibility(GONE) 设置动画
..最后
最后一个示例包含您需要的所有代码。对我来说它看起来有点骇人听闻,尤其是您必须最初设置view.bottomMargin = -50
或更多,否则动画第一次无法正常工作,但到目前为止我没有找到任何可行的替代方案(除了使用带有您自己的容器的 ScrollView项目而不是 ListView)。
最后,这个应用程序包括上面的示例,以及许多其他有用的示例以及源链接:
更新:谷歌据称因侵犯知识产权而从 Play 商店中删除了该应用程序(尽管它仅包含演示和开源项目的链接),作者现在使该 apk 可从http://goo.gl/ihcgs直接下载 了解更多信息详情见https://plus.google.com/108176685096570584154/posts。注意:我不隶属于作者。
我为一个简单的列表视图做了类似的工作。为此,我覆盖了 getView 方法并在每个列表项上应用了向上(或向下)动画。翻译程度由列表项的位置决定。
我找到了解决此问题的可能(部分)解决方法。
首先你需要存储 ExpnadableListView 的滚动状态:
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
this.mScrollState = scrollState;
}
public int getScrollState() {
return this.mScrollState;
}
对于 listView 本身,您需要存储单击了哪个组,以便只有它的子项才会获得动画效果:
mListView.setOnGroupClickListener(...
@Override
public boolean onGroupClick(...){
mGroupPosition=groupPosition;
现在,在 getChildView() 方法中,检查滚动的状态,如果它是空闲的,则启动动画,例如:
public View getChildView(...) {
// <=prepare rootView and return it later
if (groupPosition==mGroupPosition&&getScrollState() == OnScrollListener.SCROLL_STATE_IDLE)
rootView.setAnimation(...)
每次展开组时,这将为子视图设置动画。
这样做的缺点是:
- 仅适用于扩展的子视图。在折叠组时,您需要考虑额外的逻辑来为它们设置动画。
- 所有动画立即开始。如果您希望以其他方式工作,则需要一个接一个地添加多个动画。