Android 标题中带有按钮的自定义ExpandableListView在展开时多次触发其事件

Android 标题中带有按钮的自定义ExpandableListView在展开时多次触发其事件,android,click,expandablelistview,eventhandler,Android,Click,Expandablelistview,Eventhandler,我写了一个自定义的ExpandableListView,它的标题是一个相对布局,有一个子元素TextView和Button 在GetGroupView中,我定义了一个btn。单击“委托”可启动一个新活动: public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent) { var view = convertV

我写了一个自定义的ExpandableListView,它的标题是一个相对布局,有一个子元素TextView和Button

在GetGroupView中,我定义了一个btn。单击“委托”可启动一个新活动:

      public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)

    {

        var view = convertView;

        var group = this.groups[groupPosition];

        if (view == null)

        {

            var inflater = context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater;

            view = inflater.Inflate(Resource.Layout.ExpListViewItem, null);

        }

        view.FindViewById<TextView>(Resource.Id.expListViewItem_txt).Text = group.GetHeader();

        view.FindViewById<Button>(Resource.Id.expListViewItem_btn).Focusable = false;

        view.FindViewById<Button>(Resource.Id.expListViewItem_btn).Click += (object sender, EventArgs e) =>

        {

            var type = e.GetType();

            if(sender.GetType() == typeof(Button))

            {

            Intent temp = new Intent(context,typeof(TestActivity));

            temp.PutExtra("TestValue", group.GetHeader());

            context.StartActivity(typeof(TestActivity));

            }

        };

        return view;

    }
    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)

    {

        var view = convertView;

        var group = this.groups[groupPosition];

        var item = group.GetItems()[childPosition];

        if (view == null)

        {

            var inflater = context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater;

            view = inflater.Inflate(Resource.Layout.expListViewChildren, null);

        }

        view.FindViewById<TextView>(Resource.Id.expListViewChildren_txt).Text = item.GetHeader();

        view.Click += delegate  

        {

            Intent temp = new Intent(context, typeof(test));

            temp.PutExtra("TestValue", item.GetHeader());

            context.StartActivity(temp);

        };



        return view;
    }
public override View GetGroupView(int-groupPosition、bool-isExpanded、View-convertView、View-group-parent)
{
var-view=convertView;
var group=this.groups[groupPosition];
如果(视图==null)
{
var inflater=context.GetSystemService(context.LayoutInflaterService)作为LayoutInflater;
视图=充气机.Inflate(Resource.Layout.ExpListViewItem,null);
}
view.findviewbyd(Resource.Id.expListViewItem_txt).Text=group.GetHeader();
view.findviewbyd(Resource.Id.expListViewItem_btn).Focusable=false;
view.FindViewById(Resource.Id.expListViewItem_btn)。单击+=(对象发送者,事件参数e)=>
{
var type=e.GetType();
if(sender.GetType()==typeof(按钮))
{
意向临时=新意向(上下文、类型(测试活动));
temp.PutExtra(“TestValue”,group.GetHeader());
上下文。启动性(类型(测试性));
}
};
返回视图;
}
如果我单击一个子项,我想开始另一项活动:

      public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)

    {

        var view = convertView;

        var group = this.groups[groupPosition];

        if (view == null)

        {

            var inflater = context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater;

            view = inflater.Inflate(Resource.Layout.ExpListViewItem, null);

        }

        view.FindViewById<TextView>(Resource.Id.expListViewItem_txt).Text = group.GetHeader();

        view.FindViewById<Button>(Resource.Id.expListViewItem_btn).Focusable = false;

        view.FindViewById<Button>(Resource.Id.expListViewItem_btn).Click += (object sender, EventArgs e) =>

        {

            var type = e.GetType();

            if(sender.GetType() == typeof(Button))

            {

            Intent temp = new Intent(context,typeof(TestActivity));

            temp.PutExtra("TestValue", group.GetHeader());

            context.StartActivity(typeof(TestActivity));

            }

        };

        return view;

    }
    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)

    {

        var view = convertView;

        var group = this.groups[groupPosition];

        var item = group.GetItems()[childPosition];

        if (view == null)

        {

            var inflater = context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater;

            view = inflater.Inflate(Resource.Layout.expListViewChildren, null);

        }

        view.FindViewById<TextView>(Resource.Id.expListViewChildren_txt).Text = item.GetHeader();

        view.Click += delegate  

        {

            Intent temp = new Intent(context, typeof(test));

            temp.PutExtra("TestValue", item.GetHeader());

            context.StartActivity(temp);

        };



        return view;
    }
public override View GetChildView(int-groupPosition、int-childPosition、bool-isLastChild、View-convertView、View-group-parent)
{
var-view=convertView;
var group=this.groups[groupPosition];
var item=group.GetItems()[childPosition];
如果(视图==null)
{
var inflater=context.GetSystemService(context.LayoutInflaterService)作为LayoutInflater;
视图=充气机.Inflate(Resource.Layout.expListViewChildren,null);
}
view.findviewbyd(Resource.Id.expListViewChildren_txt).Text=item.GetHeader();
查看。单击+=委派
{
意向临时=新意向(上下文、类型(测试));
temp.PutExtra(“TestValue”,item.GetHeader());
上下文。起始触觉(temp);
};
返回视图;
}
如果ListView已折叠,则一切正常,但如果其已展开,则活动将启动两次(因为btn.click委托将被触发两次)

我错过了什么


谢谢你的帮助

我遇到了一个非常类似的情况-确保您的委托没有通过被调用两次来声明两个实例。当listview展开时,是否再次调用委托声明


可能存在两个处理程序,您需要找到每个处理程序并消除其中一个

记录声明调用-查看日志以了解发生了什么。@user1021605您是从不同的地方创建此列表的吗?这听起来像是在多个上下文中创建的。所以我再次检查了一下——我注意到了以下几点:正如前面所说的,GetGroupView调用的是所有组中的儿童总数。迭代第一个视图时,该视图为null并膨胀。在n+1视图中迭代不为null,不会膨胀,因此代理会附加n+1次。由于我对每个组进行了多次迭代,每个按钮都附加了几个委托-所以主要的问题是-为什么getgroupview会调用每个子级的总和?如何实例化listview实现?你能发布你的代码吗?我上传了一个测试PP:如果一切都崩溃了,你点击了扰流板,它就会按预期工作。当你展开一个项目并点击扰流板时,标题将不是你点击的那个,所以下面的代码看起来很混乱。FindViewById(Resource.Id.expListViewItem_btn)。点击+=(object sender,EventArgs e)=>{Intent temp=new Intent(context,typeof(test));temp.PutExtra(“TestValue”,group.GetHeader();context.StartActivity(temp);};