美文网首页
带吸顶效果的ExpandableListView

带吸顶效果的ExpandableListView

作者: 小相柳 | 来源:发表于2020-05-27 16:26 被阅读0次
public class StickHeadExpandableListView  extends ExpandableListView {
    private View header;
    
    public StickHeadExpandableListView  (Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public StickHeadExpandableListView  (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public StickHeadExpandableListView  (Context context) {
        super(context);
        init();
    }
    
    public void init() {
        setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {}

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                //System.out.println("first:" + firstVisibleItem + " visible:" + visibleItemCount + " total:" + totalItemCount);
                ExpandableListAdapter adapter = getExpandableListAdapter();
                if (adapter != null && adapter.getGroupCount() > 0) {
                    View first = view.getChildAt(0);
                    StickHeadListAdapter .ViewInfo tag = (StickHeadListAdapter .ViewInfo)first.getTag();
                    header = adapter.getGroupView(tag.groupPosition, isGroupExpanded(tag.groupPosition), header, StickHeadExpandableListView  .this);
                    //measureHeader();
                    View next = null;
                    int y = 0;
                    if (tag.childPosition == -1) {
                        if (!isGroupExpanded(tag.groupPosition)) {
                            next = view.getChildAt(1);
                        }
                    } else {
                        int count = adapter.getChildrenCount(tag.groupPosition);
                        next = view.getChildAt(count - tag.childPosition); 
                    }
                    if (next != null) {
                        int top = next.getTop();
                        int height = header.getMeasuredHeight();
                        if (top < height) {
                            y = top - height;
                        }
                    }
                    header.layout(0, y, header.getMeasuredWidth(), header.getMeasuredHeight());
                } 
            }
        });
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (header != null) {
            measureChild(header, widthMeasureSpec, heightMeasureSpec);
        }
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        if (null != header) {
            drawChild(canvas, header, getDrawingTime());
        }
    }
 }

//Adapter如下:
public class StickHeadListAdapter extends BaseExpandableListAdapter {
    @Override
    public int getGroupCount() {
        return 0;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return 0;
    }

    @Override
    public Object getGroup(int groupPosition) {
        return null;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return null;
    }

    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
       ExampleAdapter.GroupHolder holder;
        if (convertView == null) {
            holder = new ExampleAdapter.GroupHolder(groupPosition, -1);
            convertView = inflater.inflate(R.layout.group_item, parent, false);
            convertView.setTag(holder);
        } else {
            holder = (ExampleAdapter.GroupHolder) convertView.getTag();
        }

        holder.groupPosition = groupPosition;

        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ExampleAdapter.ChildHolder holder;
        if (convertView == null) {
            holder = new ExampleAdapter.ChildHolder(groupPosition, childPosition);
            convertView = inflater.inflate(R.layout.child_item, parent, false);
            convertView.setTag(holder);
        } else {
            holder = (ExampleAdapter.ChildHolder) convertView.getTag();
        }

        holder.groupPosition = groupPosition;
        holder.childPosition = childPosition;

        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }

    public static class ChildHolder extends ExampleAdapter.ViewInfo {

        public ChildHolder(int g, int c) {
            super(g, c);
        }
    }

    public static class GroupHolder extends ExampleAdapter.ViewInfo {

        public GroupHolder(int g, int c) {
            super(g, c);
        }
    }


    public static class ViewInfo {
        int groupPosition = -1;
        int childPosition = -1;

        public ViewInfo(int g, int c) {
            this.groupPosition = g;
            this.childPosition = c;
        }
    }
}

相关文章

网友评论

      本文标题:带吸顶效果的ExpandableListView

      本文链接:https://www.haomeiwen.com/subject/ffawahtx.html