public class MyTagExpandableListAdapter extends BaseExpandableListAdapter { private static final int CHILD_TYPE_COUNT = 2; private Context _context; private List _listDataHeader; // header titles // child data in format of header title, child title private HashMap> _listDataChild; public MyTagExpandableListAdapter(Context context, List listDataHeader, HashMap> listChildData) { this._context = context; this._listDataHeader = listDataHeader; this._listDataChild = listChildData; } @Override public Object getChild(int groupPosition, int childPosititon) { return this._listDataChild.get(this._listDataHeader.get(groupPosition)) .get(childPosititon); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public int getChildType(int groupPosition, int childPosition) { String s = (String)getChild(groupPosition, childPosition); if(s.isEmpty()) return 0; else return 1; } @Override public int getChildTypeCount() { return CHILD_TYPE_COUNT; } @Override public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final String childText = (String) getChild(groupPosition, childPosition); EmptyViewHolder emptyViewHolder = null; PopulatedViewHolder populatedViewHolder = null; int type = getChildType(groupPosition, childPosition); if (convertView == null || (type == 0 && (convertView.getTag()) instanceof PopulatedViewHolder) || (type == 1 && (convertView.getTag()) instanceof EmptyViewHolder)) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); switch(type){ case 0: //type is empty emptyViewHolder = new EmptyViewHolder(); convertView = infalInflater.inflate(R.layout.empty_layout, parent, false); TextView tv = (TextView) convertView.findViewById(R.id.empty); emptyViewHolder.empty = tv; //...initialize your viewcomponents of the populated layout here... convertView.setTag(emptyViewHolder); break; case 1: populatedViewHolder = new PopulatedViewHolder(); convertView = infalInflater.inflate(R.layout.list_item, null); TextView tv1 = (TextView) convertView.findViewById(R.id.lblListItem); populatedViewHolder.UserName = tv1; convertView.setTag(populatedViewHolder); } } else { switch (type) { case 0: emptyViewHolder = (EmptyViewHolder)convertView.getTag(); break; case 1: populatedViewHolder = (PopulatedViewHolder)convertView.getTag(); break; } } switch(type){ case 0: //empty //set the values of your empty view here emptyViewHolder.empty.setText("test"); break; case 1: //populated //set the values of your populated view here populatedViewHolder.UserName.setText(childText); break; } return convertView; } @Override public int getChildrenCount(int groupPosition) { return this._listDataChild.get(this._listDataHeader.get(groupPosition)) .size(); } @Override public Object getGroup(int groupPosition) { return this._listDataHeader.get(groupPosition); } @Override public int getGroupCount() { return this._listDataHeader.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { String headerTitle = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_group, null); } TextView lblListHeader = (TextView) convertView .findViewById(R.id.lblListHeader); lblListHeader.setTypeface(null, Typeface.BOLD); lblListHeader.setText(headerTitle); return convertView; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } static class PopulatedViewHolder { //declare the elements of a populated view here public TextView UserName; } static class EmptyViewHolder { //declare the elements of an empty view here public TextView empty; } }