6

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

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

在此处输入图像描述

  1. 当我尝试实现 Jeff 的方法时,似乎标题恰好有一个指示器并且可点击。当我想到它时,这似乎不对。标题不应该是可扩展列表视图,或者至少不应该表现得像一个。
  2. 我还注意到,在实现自定义可扩展列表适配器时,我不再具有 IsEnabled() 函数。这可能是我的标题被启用为可扩展列表视图的原因。我认为我可能已被 IsChildSelectable() 取代,但这不是我需要的(启用/禁用组列表)。

我确实在 IRC 频道中问过某人,他们告诉我,我可能会在包装部分遗漏几个步骤,但我不能确定,所以我暂时抛出代码。

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

分离的ExpandableAdapter 类

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

0 回答 0