package se.emilsjolander.stickylistheaders; import android.content.Context; import android.util.AttributeSet; import android.view.View; import java.util.List; /** * add expand/collapse functions like ExpandableListView * @author lsjwzh */ public class ExpandableStickyListHeadersListView extends StickyListHeadersListView { public interface IAnimationExecutor{ public void executeAnim(View target,int animType); } public final static int ANIMATION_COLLAPSE = 1; public final static int ANIMATION_EXPAND = 0; ExpandableStickyListHeadersAdapter mExpandableStickyListHeadersAdapter; IAnimationExecutor mDefaultAnimExecutor = new IAnimationExecutor() { @Override public void executeAnim(View target, int animType) { if(animType==ANIMATION_EXPAND){ target.setVisibility(VISIBLE); }else if(animType==ANIMATION_COLLAPSE){ target.setVisibility(GONE); } } }; public ExpandableStickyListHeadersListView(Context context) { super(context); } public ExpandableStickyListHeadersListView(Context context, AttributeSet attrs) { super(context, attrs); } public ExpandableStickyListHeadersListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public ExpandableStickyListHeadersAdapter getAdapter() { return mExpandableStickyListHeadersAdapter; } @Override public void setAdapter(StickyListHeadersAdapter adapter) { mExpandableStickyListHeadersAdapter = new ExpandableStickyListHeadersAdapter(adapter); super.setAdapter(mExpandableStickyListHeadersAdapter); } public View findViewByItemId(long itemId){ return mExpandableStickyListHeadersAdapter.findViewByItemId(itemId); } public long findItemIdByView(View view){ return mExpandableStickyListHeadersAdapter.findItemIdByView(view); } public void expand(long headerId) { if(!mExpandableStickyListHeadersAdapter.isHeaderCollapsed(headerId)){ return; } mExpandableStickyListHeadersAdapter.expand(headerId); //find and expand views in group List<View> itemViews = mExpandableStickyListHeadersAdapter.getItemViewsByHeaderId(headerId); if(itemViews==null){ return; } for (View view : itemViews) { animateView(view, ANIMATION_EXPAND); } } public void collapse(long headerId) { if(mExpandableStickyListHeadersAdapter.isHeaderCollapsed(headerId)){ return; } mExpandableStickyListHeadersAdapter.collapse(headerId); //find and hide views with the same header List<View> itemViews = mExpandableStickyListHeadersAdapter.getItemViewsByHeaderId(headerId); if(itemViews==null){ return; } for (View view : itemViews) { animateView(view, ANIMATION_COLLAPSE); } } public boolean isHeaderCollapsed(long headerId){ return mExpandableStickyListHeadersAdapter.isHeaderCollapsed(headerId); } public void setAnimExecutor(IAnimationExecutor animExecutor) { this.mDefaultAnimExecutor = animExecutor; } /** * Performs either COLLAPSE or EXPAND animation on the target view * * @param target the view to animate * @param type the animation type, either ExpandCollapseAnimation.COLLAPSE * or ExpandCollapseAnimation.EXPAND */ private void animateView(final View target, final int type) { if(ANIMATION_EXPAND==type&&target.getVisibility()==VISIBLE){ return; } if(ANIMATION_COLLAPSE==type&&target.getVisibility()!=VISIBLE){ return; } if(mDefaultAnimExecutor !=null){ mDefaultAnimExecutor.executeAnim(target,type); } } }