带有节标题的可扩展ListView

时间:2013-05-23 03:11:23

标签: android header xamarin.android expandablelistview expandablelistadapter

我想创建一个带有节标题的可扩展列表视图。我尝试了以下示例的两个示例方法,

我设法使用listView使这些工作正常,但是,当我切换到使用expandableListView时,我遇到了一些问题:

enter image description here

  1. 当我尝试实现Jeff的方法时,标题似乎恰好有一个指示符并且可以点击。当我想到它时,这似乎不对。标题不应该是一个expandableListView,或者至少不应该表现得像一个。
  2. 我还注意到,在实现自定义expandableListAdapter时,我不再具有IsEnabled()的函数。这可能是我的标题作为expandablelistview启用的原因。我认为我可能已被IsChildSelectable()取代,但它不是我需要的(启用/禁用组列表)。
  3. 我确实在IRC频道询问过某人,他们告诉我可能是因为我可能会错过包装部分的几个步骤,但我不能确定,所以我暂时抛出代码

    (顺便说一下,我正在使用Xamarin的monodroid。但风格和流程或多或少与android相同,所以我也了解android的代码,所以在这里)

    SeparatedExpandableAdapter类

    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; }
            }
        }
    }
    

0 个答案:

没有答案