将animation添加到ExpandableListView

有没有办法在Android中打开可扩展列表时添加animation? 我想这样,当用户点击可展开的列表,它有一个animation/效果就像我打开一个滑动抽屉。

它移动缓慢,直到完全打开。

Solutions Collecting From Web of "将animation添加到ExpandableListView"

我花了很多时间search没有运气。 现有的解决scheme不够stream畅 – 如果您的布局比2个button更为复杂,则会变得迟缓。

所以,我创build了自己的ListAdapter ,将整个视图caching到Bitmap ,然后在caching视图上执行animation,而不是视图本身。 它工作更快。

这里是: https : //github.com/dmitry-zaitsev/ExpandableAdapter

好消息是,你不需要重写一堆代码 – 只需在适配器周围包装我的ExpandableAdapter ,并提供视图的id,这将作为一个切换button,视图的id保存第二级:

 new ExpandableAdapter(context, yourAdapter, R.id.switch, R.id.holder); 

这就是全部。

我也试图做这个工作。 我find了一个适用于childViews的解决scheme。 虽然它并没有激发团队的实际扩张,但是它们充满了扩张留下的空间,使得孩子的细胞更具活力。

编辑:崩溃中有一个错误,这将使一些不应该被隐藏的单元变得隐藏起来。 这可能与listView中的View-recycling有关。 当我有解决scheme时,我会更新。

在setOnGroupClickListener中使用layoutAnimation进行animation处理

  mResultList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { if(mResultList.isGroupExpanded(groupPosition)){ mProgAdap.prepareToCollapseGroup(groupPosition); setupLayoutAnimationClose(groupPosition); mResultList.requestLayout(); }else{ boolean autoScrollToExpandedGroup = false; mResultList.expandGroup(groupPosition,autoScrollToExpandedGroup); setupLayoutAnimation(); //*/ } //telling the listView we have handled the group click, and don't want the default actions. return true; } private void setupLayoutAnimation() { AnimationSet set = new AnimationSet(true); Animation animation = new AlphaAnimation(0.0f, 1.0f); animation.setDuration(50); set.addAnimation(animation); animation = new ScaleAnimation(1.0f, 1.0f, 0.0f, 1.0f, 0.5f, 1.0f); animation.setDuration(50); set.addAnimation(animation); LayoutAnimationController controller = new LayoutAnimationController(set, 0.75f); mResultList.setLayoutAnimationListener(null); mResultList.setLayoutAnimation(controller); } private void setupLayoutAnimationClose(final int groupPosition) { AnimationSet set = new AnimationSet(true); Animation animation = new AlphaAnimation(1.0f, 0.0f); animation.setDuration(50); animation.setFillAfter(true); animation.setFillEnabled(true); set.addAnimation(animation); animation = new ScaleAnimation(1.0f, 1.0f, 1.0f, 0.0f, 0.5f, 0.0f); animation.setDuration(50); animation.setFillAfter(true); animation.setFillEnabled(true); set.addAnimation(animation); set.setFillAfter(true); set.setFillEnabled(true); LayoutAnimationController controller = new LayoutAnimationController(set, 0.75f); controller.setOrder(LayoutAnimationController.ORDER_REVERSE); mResultList.setLayoutAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mResultList.collapseGroup(groupPosition); } @Override public void onAnimationRepeat(Animation animation) { } }); mResultList.setLayoutAnimation(controller); } }); 

我们需要更多的调整,使animation只适用于展开/折叠组的实际的孩子。 因为我们不能在LayoutAnimationController中重载正确的部分,我们需要创build一个特殊的ViewGroup类。 这与“Can LayoutAnimationController只animation指定的视图”的技巧是一样的。

在ExpandableListViewAdapter中,我们现在需要一些状态处理来允许或忽略列表中项目的animation。

  @Override public void onGroupExpanded(int groupPos){ super.onGroupExpanded(groupPos); int childCount = getChildrenCount(groupPos); Log.d("EXPLIST","setting children to be expanded:" + childCount); for(int j=0; j < getGroupCount(); j++){ for(int k=0; k < getChildrenCount(j); k++){ GoalServiceCell cell = (GoalServiceCell)getChild(j,k); cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_NOT_ANIMATE; } } for(int i=0; i < childCount; i++){ GoalServiceCell cell = (GoalServiceCell)getChild(groupPos,i); cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_START_EXPAND; } } public void prepareToCollapseGroup(int groupPos){ int childCount = getChildrenCount(groupPos); for(int j=0; j < getGroupCount(); j++){ for(int k=0; k < getChildrenCount(j); k++){ GoalServiceCell cell = (GoalServiceCell)getChild(j,k); cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_NOT_ANIMATE; } } for(int i=0; i < childCount; i++){ GoalServiceCell cell = (GoalServiceCell)getChild(groupPos,i); cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_START_COLLAPSIN; } } @Override public void onGroupCollapsed(int groupPos){ super.onGroupCollapsed(groupPos); int childCount = getChildrenCount(groupPos); for(int i=0; i < childCount; i++){ GoalServiceCell cell = (GoalServiceCell)getChild(groupPos,i); cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_NOT_ANIMATE; } } 

并在ViewHolder的孩子。

  void expandOrCollapse(GoalServiceCell cell,int position){ AnimationAverseRelativeLayout hack = (AnimationAverseRelativeLayout)master; boolean shouldAnim = cell.expandAnimState == GoalServiceCell.ExpandAnimState.SHOULD_START_EXPAND || cell.expandAnimState == GoalServiceCell.ExpandAnimState.SHOULD_START_COLLAPSIN; hack.setIfShouldAnimate(shouldAnim); } 

GroupViews也包含在AnimationAverseRelativeLayout中。 由于我已经将“shouldAnimate”设置为false,所以我不需要去碰它们。

我有同样的确切问题。 我一劳永逸地解决了这个问题。 我开源给github。 https://github.com/tjerkw/Android-SlideExpandableListView

基本上,你的Android项目中包含了这个项目依赖项。 然后将你的ListAdapter包装到一个SlideExpandableListAdapter 。 包装器然后将添加滑动functionanimation到您的ListView

希望它可以帮助你,我已经在两个项目中使用它。

所以我所做的就是使用常规的ListView ,然后在onListItemClick中执行animation。 animation类似于我在这个链接所做的: Androidanimation下拉/上视图

但仅限于行视图的一部分。 行视图在xml中以下列方式实现:

 <somelayout> <normal> </normal> <expanded> </expanded> </somelayout> 

正常使用没有扩展。 展开被激活时,展开设置为可见而不是消失。 您需要保持控制权设置它closures时再次(记住这是设置在您的convertviews被回收)。

如果需要,我可以进一步澄清,这只是相当多的代码。

这就是我在这种情况下所做的。

ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(list1,PropertyValuesHolder.ofInt(“bottom”,currentlistHeight,currentlistHeight * 2));

这将做的是,ListView的高度将得到加倍,这将是animation 。 如果你设置当前列表的高度为零 。 这将像一个抽屉。