I want to create an extensible list view with section headers. I tried using two examples from the following example:
I managed to get them to work using listView, however, when I switch to using expandableListView, I ran into several problems:

- As I try to implement Jeff's method, the headers seem to have an indicator and interactivity. When I think about it, this does not seem right. headers should not be extensible ListView or, at least, should not behave as one.
- I also noticed that I no longer have a function for IsEnabled () when implementing for a custom expandableListAdapter. this may be the reason that my headers are included as an extended list. I thought that I could be replaced by IsChildSelectable (), but this is not what I need (this is to enable / disable the list of groups).
I asked someone on the IRC channel, and they told me that it may be that I can skip a few steps to parts for the transfer, but I canβt be sure of it, so for now I would drop the code.
(By the way, I use the Xamarin single-mode Android module, but the style and stream are more or less the same as android, so I understand the Android code, so here it is)
SeparatedExpandableAdapter class
using System; using System.Collections.Generic; using Android.Content; using Android.Views; using Android.Widget; using Object = Java.Lang.Object; namespace AndroidApplication10 { class SeparatedExpandableListAdapter :BaseExpandableListAdapter { public readonly Context context; public readonly Dictionary<string, IExpandableListAdapter> sections = new Dictionary<string, IExpandableListAdapter>(); public readonly ArrayAdapter<string> headers; public static readonly int TYPE_SECTION_HEADER = 0; public SeparatedExpandableListAdapter(Context context) { this.context = context; headers = new ArrayAdapter<string>(context, Resource.Layout.list_header, Resource.Id.list_header_title); } //register our adapter with a section. public void AddSection(string section, IExpandableListAdapter adapter) { headers.Add(section); sections.Add(section, adapter); } /* * Algorithm for separatedList * ::correctly find the selected item among child adapters:: * - subtract from the original position * - do logic once the position find the header (position == 0) * - do logic once the position find the adapter (position < size) */ public override Object GetGroup(int groupPosition) { foreach (var section in sections) { var size = section.Value.GroupCount + 1; if (groupPosition == 0) return section.Key; if (groupPosition < size) return section.Value.GetGroup(groupPosition - 1); groupPosition -= size; } return null; } public override Object GetChild(int groupPosition, int childPosition) { foreach (var section in sections) { var size = section.Value.GroupCount + 1; if (groupPosition == 0) return null; if (groupPosition < size) return section.Value.GetChild(groupPosition - 1, childPosition); groupPosition -= size; } return null; } public override int GroupCount { get { var total = 0; foreach (var adapter in sections.Values) { total += adapter.GroupCount + 1; } return total; } } public override int GetChildrenCount(int groupPosition) { foreach (var section in sections) { var size = section.Value.GroupCount + 1; if (groupPosition == 0) return 0; if (groupPosition < size) return section.Value.GetChildrenCount(groupPosition - 1); groupPosition -= size; } return 0; } public override bool IsEmpty { get { return true; } } public override int GroupTypeCount { get { var total = 1; foreach (var adapter in sections.Values) { Console.WriteLine("[ROXEZ]: GroupTypeCount? " + ((BaseExpandableListAdapter)adapter).GroupTypeCount); total += ((BaseExpandableListAdapter) adapter).GroupTypeCount; //? Console.WriteLine("[ROXEZ]: total? " + total); } return total; } } public override int ChildTypeCount { get { return base.ChildTypeCount; } } public override int GetGroupType(int groupPosition) { var type = 1; foreach (var section in sections) { var size = section.Value.GroupCount + 1; if (groupPosition == 0) return TYPE_SECTION_HEADER; if (groupPosition < size) return ((BaseExpandableListAdapter) (section.Value)).GetGroupType(groupPosition); groupPosition -= size; type += ((BaseExpandableListAdapter) (section.Value)).GroupTypeCount; } return -1; } public override int GetChildType(int groupPosition, int childPosition) { return base.GetChildType(groupPosition, childPosition); } public override bool AreAllItemsEnabled() { return false; } public override bool IsChildSelectable(int groupPosition, int childPosition) { Console.WriteLine("Position: " + groupPosition + " | Output: " + (GetGroupType(groupPosition) != TYPE_SECTION_HEADER)); return (GetGroupType (groupPosition) != TYPE_SECTION_HEADER); } public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent) { var sectionNum = 0; foreach (var section in sections) { var size = section.Value.GroupCount + 1; if (groupPosition == 0) { return headers.GetView(groupPosition, convertView, parent); } if (groupPosition < size) return section.Value.GetGroupView(groupPosition - 1, isExpanded, convertView, parent); groupPosition -= size; sectionNum++; } return null; } public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) { var sectionNum = 0; foreach (var section in sections) { var size = section.Value.GroupCount + 1; if (groupPosition == 0) return null; if (groupPosition < size) return section.Value.GetChildView(groupPosition - 1, childPosition, isLastChild, convertView, parent); groupPosition -= size; sectionNum++; } return null; } public override long GetGroupId(int groupPosition) { return groupPosition; } public override long GetChildId(int groupPosition, int childPosition) { return childPosition; } public override bool HasStableIds { get { return true; } } } }