30

是否可以为 expandableListView 应用展开或折叠动画?

4

3 回答 3

10

它可以使用一个简单的 ListView 来完成,该 ListView 包含一个最初隐藏的视图和一个扩展 Animation 的自定义类。基本思想是开始,View.GONE然后逐渐将边距从负值重新调整到所需大小,同时将可见性设置为View.VISIBLE.

看:

..最后

最后一个示例包含您需要的所有代码。对我来说它看起来有点骇人听闻,尤其是您必须最初设置view.bottomMargin = -50或更多,否则动画第一次无法正常工作,但到目前为止我没有找到任何可行的替代方案(除了使用带有您自己的容器的 ScrollView项目而不是 ListView)。

最后,这个应用程序包括上面的示例,以及许多其他有用的示例以及源链接:

更新:谷歌据称因侵犯知识产权而从 Play 商店中删除了该应用程序(尽管它仅包含演示和开源项目的链接),作者现在使该 apk 可从http://goo.gl/ihcgs直接下载 了解更多信息详情见https://plus.google.com/108176685096570584154/posts。注意:我不隶属于作者。

于 2012-02-02T12:55:46.157 回答
1

我为一个简单的列表视图做了类似的工作。为此,我覆盖了 getView 方法并在每个列表项上应用了向上(或向下)动画。翻译程度由列表项的位置决定。

于 2012-02-02T11:15:42.283 回答
1

我找到了解决此问题的可能(部分)解决方法。

首先你需要存储 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(...)

每次展开组时,这将为子视图设置动画。

这样做的缺点是:

  1. 仅适用于扩展的子视图。在折叠组时,您需要考虑额外的逻辑来为它们设置动画。
  2. 所有动画立即开始。如果您希望以其他方式工作,则需要一个接一个地添加多个动画。
于 2014-01-02T13:33:58.033 回答