Android ExpandableListView使用动画

Lê *_*yền 15 animation android expandablelistview

我正在使用

<ExpandableListView
     android:id="@+id/listView"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >
</ExpandableListView>
Run Code Online (Sandbox Code Playgroud)

我想在onc​​lick父级时为孩子添加动画幻灯片.那我该怎么办?

idu*_*olz 53

最后更新

我写这个答案已经有一段时间了.从那以后,很多事都发生了变化 最大的变化是引入RecyclerView这使得动画列表或网格变得容易.RecyclerView如果可以,我强烈建议切换到s.对于那些不能的人,我会看到我可以做些什么来修复我的库的错误.


原始答案

我实际上不喜欢动画的ExpandableListView的流行实现,它简单地使用带有扩展动画的ListView,因为在我的用例中,我的每个组都有很多孩子,因此使用普通的ListView作为孩子是不可行的视图将不会被回收,并且内存使用量会很大,性能会很差.相反,我采用了更加困难但更具可扩展性和灵活性的方法.

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

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

最后,完成所有这些后,我不仅能够获得所需的动画效果,还能获得所需的性能,因为此方法适用于拥有100多名儿童的小组.

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

更新:

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


Hir*_*bhi 6

@idunnololz解决方案效果很好.但是我想添加一些代码来折叠以前扩展的组.

private int previousGroup=-1;

    listView.setOnGroupClickListener(new OnGroupClickListener() {

        @Override
        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
            // We call collapseGroupWithAnimation(int) and
            // expandGroupWithAnimation(int) to animate group 
            // expansion/collapse.
            if (listView.isGroupExpanded(groupPosition)) {
                listView.collapseGroupWithAnimation(groupPosition);
                previousGroup=-1;
            } else {
                listView.expandGroupWithAnimation(groupPosition);
                if(previousGroup!=-1){
                    listView.collapseGroupWithAnimation(previousGroup); 
                }
                previousGroup=groupPosition;
            }

            return true;
        }

    });
Run Code Online (Sandbox Code Playgroud)


Kur*_*ikS 5

animateLayoutChanges adds auto-animation
<ExpandableListView
        android:animateLayoutChanges="true"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>
Run Code Online (Sandbox Code Playgroud)