C# Xamarin Android子方法从未在ExpandableListAdapter中调用

C# Xamarin Android子方法从未在ExpandableListAdapter中调用,c#,android,xamarin,expandablelistadapter,C#,Android,Xamarin,Expandablelistadapter,我对ExpandableListAdapter有问题。我无法让列表展开。似乎所有这些子方法都有问题: Java.Lang.Object GetChild(int-groupPosition,int-childPosition) 公共覆盖长GetChildId(int-groupPosition,int-childPosition) 公共覆盖视图GetChildView(int-groupPosition、int-childPosition、bool-isLastChild、View-conver

我对ExpandableListAdapter有问题。我无法让列表展开。似乎所有这些子方法都有问题:

Java.Lang.Object GetChild(int-groupPosition,int-childPosition)
公共覆盖长GetChildId(int-groupPosition,int-childPosition)
公共覆盖视图GetChildView(int-groupPosition、int-childPosition、bool-isLastChild、View-convertView、ViewGroup-parent)
公共覆盖int GetChildrenCount(int groupPosition)

这些方法永远不会被调用。我似乎不明白为什么。这是我的密码:

ExpandableTaskListAdapter.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace MyProject
{
    public class ExpandableTaskListAdapter : BaseExpandableListAdapter
    {
        private readonly Context context;
        private readonly List<string> headers;
        private readonly Dictionary<string, List<string>> listChildData;
        private readonly LayoutInflater inflater;
        private readonly bool[] expanded;

        public ExpandableTaskListAdapter(Context context, List<string> headers, Dictionary<string, List<string>> listChildData, LayoutInflater inflater)
        {
            this.context = context;
            this.headers = headers;
            this.listChildData = listChildData;
            this.inflater = inflater;
            expanded = new bool[headers.Count];
        }

        public override void OnGroupCollapsed(int groupPosition)
        {
            expanded[groupPosition] = !expanded[groupPosition];
            base.OnGroupCollapsed(groupPosition);
        }

        public override void OnGroupExpanded(int groupPosition)
        {
            expanded[groupPosition] = !expanded[groupPosition];
            base.OnGroupExpanded(groupPosition);
        }

        public override Java.Lang.Object GetChild(int groupPosition, int childPosition)
        {
            return listChildData[headers[groupPosition]][childPosition];
        }

        public override long GetChildId(int groupPosition, int childPosition)
        {
            return childPosition;
        }

        public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
        {
            string childText = (string)GetChild(groupPosition, childPosition);
            convertView = inflater.Inflate(Resource.Layout.task_child, null);

            TextView listChild = convertView.FindViewById<TextView>(Resource.Id.label);
            listChild.Text = childText;

            return convertView;
        }

        public override int GetChildrenCount(int groupPosition)
        {
            return listChildData[headers[groupPosition]].Count;
        }

        public override Java.Lang.Object GetGroup(int groupPosition)
        {
            return headers[groupPosition];
        }

        public override long GetGroupId(int groupPosition)
        {
            return groupPosition;
        }

        public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
        {
            string headerTitle = (string)GetGroup(groupPosition);

            convertView = inflater.Inflate(Resource.Layout.task_child, null);

            TextView header = convertView.FindViewById<TextView>(Resource.Id.label);
            header.Text = headerTitle;

            convertView.FindViewById<LinearLayout>(Resource.Id.main_layout).Click += (sender, e) =>
            {
                if (expanded[groupPosition])
                    OnGroupCollapsed(groupPosition);
                else
                    OnGroupExpanded(groupPosition);
            };

            return convertView;
        }

        public override int GroupCount
        {
            get { return headers.Count; }
        }

        public override bool HasStableIds
        {
            get { return true; }
        }

        public override bool IsChildSelectable(int groupPosition, int childPosition)
        {
            return true;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Android.App;
使用Android.Content;
使用Android.OS;
使用Android.Runtime;
使用Android.Views;
使用Android.Widget;
名称空间MyProject
{
公共类ExpandableTaskListAdapter:BaseExpandableListAdapter
{
私有只读上下文;
私有只读列表标题;
私有只读字典listChildData;
私人只读充气机;
私有只读bool[]扩展;
public ExpandableTaskListAdapter(上下文上下文、列表标题、字典listChildData、LayoutInflater充气器)
{
this.context=上下文;
this.headers=标题;
this.listChildData=listChildData;
这个。充气机=充气机;
expanded=newbool[headers.Count];
}
公共覆盖无效组折叠(int-groupPosition)
{
展开的[groupPosition]=!展开的[groupPosition];
base.ongroupposition(groupPosition);
}
公共覆盖无效OnGroupExpanded(int groupPosition)
{
展开的[groupPosition]=!展开的[groupPosition];
base.OnGroupExpanded(groupPosition);
}
public override Java.Lang.Object GetChild(int-groupPosition,int-childPosition)
{
返回listChildData[headers[groupPosition]][childPosition];
}
公共覆盖长GetChildId(int-groupPosition,int-childPosition)
{
返回子位置;
}
公共覆盖视图GetChildView(int-groupPosition、int-childPosition、bool-isLastChild、视图转换视图、视图组父视图)
{
string childText=(string)GetChild(groupPosition,childPosition);
convertView=inflater.Inflate(Resource.Layout.task_子项,null);
TextView listChild=convertView.FindViewById(Resource.Id.label);
Text=childText;
返回视图;
}
公共覆盖int GetChildrenCount(int groupPosition)
{
返回listChildData[headers[groupPosition]].Count;
}
public override Java.Lang.Object GetGroup(int-groupPosition)
{
返回标题[groupPosition];
}
公共覆盖长GetGroupId(int-groupPosition)
{
返回组位置;
}
公共覆盖视图GetGroupView(int-groupPosition、bool-isExpanded、视图转换视图、视图组父级)
{
字符串头文件=(字符串)GetGroup(groupPosition);
convertView=inflater.Inflate(Resource.Layout.task_子项,null);
TextView头=convertView.FindViewById(Resource.Id.label);
header.Text=headerTitle;
convertView.FindViewById(Resource.Id.main_布局)。单击+=(发件人,e)=>
{
if(扩展的[groupPosition])
OnGroupPosition(groupPosition);
其他的
OnGroupPosition(groupPosition);
};
返回视图;
}

公共覆盖int-GroupCount { 获取{return headers.Count;} } 公共覆盖布尔表ID { 获取{return true;} } 公共覆盖bool ischildselect(int-groupPosition,int-childPosition) { 返回true; } } }
task_child.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="5dp">

  <TextView
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:layout_gravity="center_vertical"
    android:textSize="17sp"
    android:paddingLeft="40dp"/>

  <ImageView
    android:id="@+id/icon"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="5dp"
    android:gravity="center_vertical"
    android:layout_gravity="center_vertical"
    android:background="@drawable/ic_delete"/>

  <CheckBox
    android:id="@+id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:layout_gravity="center_vertical"/>

</LinearLayout>


在构造函数中放置一个断点,我可以看到我正在传递正确的数据。为什么从未调用子方法?

当单击您的
GroupHeaderView
时,ExpandableListView调用
OnGroupExpanded
,其中设置了
expanded[position]=true

但是,也会调用GroupHeaderView中列表视图上的
。单击
订阅者,在其中找到
展开的[position]==true
,并调用
OnGroupCollapsed
方法。这导致该小组根本没有扩大,也没有对其子女提出任何要求

只需删除
。单击
GetGroupView
方法中的
处理程序,一切都会正常工作

    public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
    {
        string headerTitle = (string)GetGroup(groupPosition);

        convertView = inflater.Inflate(Resource.Layout.task_child, null);

        TextView header = convertView.FindViewById<TextView>(Resource.Id.label);
        header.Text = headerTitle;

        return convertView;
    }
public override View GetGroupView(int-groupPosition、bool-isExpanded、View-convertView、View-group-parent)
{
字符串头文件=(字符串)GetGroup(groupPosition);
convertView=inflater.Inflate(Resource.Layout.task_子项,null);
TextView头=convertView.FindViewById(Resource.Id.label);
header.Text=headerTitle;
返回视图;
}

public override int GroupCount{get{return headers.Count;}}你能调试那一行并检查值吗?在get{return headers.Count;}上放一个断点我能看到headers.Count的值是1。我想你有可能在调试器暂停应用程序时调用方法,因此,尝试使用0或1调用GetChildrenCount并查看结果。如果结果为0,则表示您没有子项。如果不止这些,那么HasstableID将变为false,如果不是,我会要求DeIcaza退款:DNegative,这并不能解决问题。