Xamarin Android Child方法从未在ExpandableListAdapter中调用

时间:2015-01-22 16:47:58

标签: c# android xamarin expandablelistadapter

我遇到ExpandableListAdapter问题。我无法获得扩展列表。似乎所有这些子方法都存在问题: Java.Lang.Object GetChild(int groupPosition, int childPosition) public override long GetChildId(int groupPosition, int childPosition) public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) public override 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;
        }
    }
}

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>

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

1 个答案:

答案 0 :(得分:0)

点击GroupHeaderView后,ExpandableListView会调用OnGroupExpanded设置的expanded[position] = true

但是,也会调用GroupHeaderView中ListView上的.Click订阅者,在其中找到expanded[position] == true并调用OnGroupCollapsed方法。这导致该集团根本没有扩展,也没有对其子女的请求。

只需删除.Click方法中的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;
    }