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;
}
}
}
网友评论