可扩展列表视图的动画效果

30

能否为可展开的ListView应用展开或折叠动画?


我认为不可能使行之间的间隙动画化,尽管我在显示为子项的视图上放置了左/右滑动动画。这只有在只有一个子项时才能正常工作。 - skorulis
3个回答

10
使用简单的ListView和一个自定义类扩展动画,就可以实现这一点。基本思路是从View.GONE开始,逐渐重新调整边距从负值到所需大小,同时将可见性设置为View.VISIBLE
参见: 最后, 最后一个例子包含了你需要的所有代码。对我来说,它看起来有点hackish,特别是你必须最初设置view.bottomMargin = -50或更多,否则第一次动画不会正常工作,但到目前为止我没有找到任何可行的替代方法(除了使用ScrollView与自己的容器项而不是ListView)。
最后,这个应用程序包括上面的例子,以及许多其他有用的例子,并带有指向来源的链接。 更新:谷歌已经从Google Play商店中将该应用程序删除,据称是因为知识产权侵犯(尽管它只包含演示和链接到开源项目),作者现在可以直接从http://goo.gl/ihcgs下载apk。更多详情请参见https://plus.google.com/108176685096570584154/posts。注:我与作者无关。

感谢提供 UI 模式应用链接。 - howettl
但这样做将失去使用listView的全部意义,因为您要展开的组内所有项都必须在其中。如果您有很多项,那么您也需要创建很多视图... - android developer
@Android开发者:你最好使用ScrollView,将其填充视图并根据需要应用动画。ListView是一个针对大型列表进行优化的复杂组件;如果你只有不到十个项目,那么滚动视图可能更容易进行动画处理——制作自己的块组件,并按照所需动画处理其中的视图。与ListView相比的主要缺点是,当滚动进入和离开视图区域时,Android不会创建/销毁你的项目,并且容器也不会被重用,但如果你只有几个项目,这并不是什么大问题。 - ccpizza
@ccpizza 这就是问题所在 - 我有很多要展示的项目,就像在列表视图中一样... :( - android developer
@ccpizza,我已经对这个问题做了一个小的解决方法,仍然使用可扩展的ListView。不过它有一些缺点... - android developer

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.所有动画同时开始。如果您希望以其他方式工作,则需要逐个添加多个动画。

这是一个有趣的方法。但从我所学到的来看,子项不是子视图,而是兄弟姐妹。那么您是使用单独的动画来为所有子项添加动画效果,还是采用其他方式?有可行的示例代码吗? - Nilzor
@Nilzor 我很久以前就完成了它,但由于我工作时间很短,所以动画的要求被取消了。抱歉。 - android developer
没问题,谢谢你回复我。对于其他人来说,这个问题基本上仍然没有解决,尽管我觉得如果Google认真对待Material设计指南的话,他们应该解决这个问题。 - Nilzor
@Nilzor 我认为"ExpnadableListView"被忽视了,因为它很少被使用。 - android developer

1

我曾经为一个简单的列表视图完成了类似的工作。为了实现这个功能,我重写了getView方法,并在每个列表项上应用了向上或向下的平移动画。平移的程度由列表项的位置决定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接