简体   繁体   English

ExpandableListView子事件

[英]ExpandableListView Child Events

I am trying to detect and handle the selection of a child in an ExpandableListView. 我试图检测和处理ExpandableListView中的子选择。 But none of the event handlers or listeners I've tried ever seem to fire. 但是,我尝试过的事件处理程序或听众似乎都没有。 Which one am I to use? 我要用哪一个? I've tried: 我试过了:

lv.Click += HandleSelect

and

lv.ItemClick += HandleSelect

and

lv.ChildClick += HandleSelect

and

lv.ItemSelected += HandleSelect

and

lv.SetOnChildClickListener(new ChildClick)

HandleSelect Event Handler HandleSelect事件处理程序

void HandleSelect(Object o, EventArgs e)
{
   var obj = o;  //Breakpoint set here and it never breaks for any of the above;
}

ChildClick listener ChildClick监听器

class ChildClick : ExpandableListView.IOnChildClickListener
{
 public void Dispose()
        {

        }

        public IntPtr Handle
        {
            get { return new IntPtr(0); }
        }

        public bool OnChildClick(ExpandableListView parent, View clickedView, int groupPosition, int childPosition, long id)
        {
            var clicked = clickedView; //Breakpoint set here, never breaks;
            return true;
        }
}

Here is the BaseExpandableListAdapter I am using to populate the ExpandableListView 这是我用来填充ExpandableListView的BaseExpandableListAdapter

 class MarketAdapter : BaseExpandableListAdapter
{
    private readonly Context _context;
    private readonly string[] _stores;
    private readonly List<string> _storeList = new List<string>();
    private readonly List<List<Call>> _calls = new List<List<Call>>(); 

    public MarketAdapter(Context context, IEnumerable<Call> calls)
    {
        _context = context;

        List<Call> marketCalls =
            (from c in calls
             where c.InProgress == "0"
             select new Call() {CallNumber = c.CallNumber, ServiceType = c.ServiceType, Priority = c.Priority, Address = c.Address, City = c.City, Contact = c.Contact, Description = c.Description, Phone = c.Phone, Site = c.Site, State = c.State}).ToList();

        foreach (IGrouping<string, Call> stores in marketCalls.GroupBy(s => s.Site))
        {                
            _storeList.Add(stores.Key + "," + stores.First().City + "," + stores.First().State);
            List<List<Call>> callgroup = new List<List<Call>>();
            List<Call> call = new List<Call>(from c in stores select new Call() {CallNumber = c.CallNumber, ServiceType = c.ServiceType, Priority = c.Priority, Description = c.Description});
            callgroup.Add(call);
            _calls.Add(call);
        }
        _stores = _storeList.ToArray();
    }

    public override Object GetChild(int groupPosition, int childPosition)
    {
        return null;
    }

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

    public override int GetChildrenCount(int groupPosition)
    {
        return _calls.ElementAt(groupPosition).Count;
    }

    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
    {
        List<Call> callList = _calls.ElementAt(groupPosition);
        Call _call = callList.ElementAt(childPosition);

        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) _context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Resource.Layout.listviewchild, null);
        }

        TextView call = (TextView) convertView.FindViewById(Resource.Id.Call);
        call.Text = _call.CallNumber;
        TextView type = (TextView) convertView.FindViewById(Resource.Id.Type);
        type.Text = _call.ServiceType;
        TextView priority = (TextView) convertView.FindViewById(Resource.Id.Priority);
        priority.Text = _call.Priority;
        TextView description = (TextView) convertView.FindViewById(Resource.Id.Description);
        description.Text = _call.Description;

        return convertView;
    }

    public override Object GetGroup(int groupPosition)
    {
        return _stores[groupPosition];
    }

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

    public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
    {
        string[] info = _stores[groupPosition].Split(new [] { "," }, StringSplitOptions.None);
        string _site = info[0];
        string _city = info[1];
        string _state = info[2];

        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) _context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Resource.Layout.listviewparent, null);
        }

        TextView site = (TextView) convertView.FindViewById(Resource.Id.Site);
        site.Text = _site;
        TextView city = (TextView) convertView.FindViewById(Resource.Id.City);
        city.Text = _city;
        TextView state = (TextView) convertView.FindViewById(Resource.Id.State);
        state.Text = _state;

        return convertView;
    }

    public override bool IsChildSelectable(int groupPosition, int childPosition)
    {
        return true;
    }

    public override int GroupCount
    {
        get { return _stores.Length; }
    }

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

EDIT: Also just tried the solution explained here OnChildClick inside ExpandableListActivity does not fire by setting the Layout and all of my TextViews focusable attrubute to false in listviewchild.axml but it still doesn't fire the listener. 编辑:也尝试解释这里解决的解决方案OnChildClick内部ExpandableListActivity不会通过设置布局和我的所有TextViews焦点attrubute在listviewchild.axml错误触发,但它仍然不会触发侦听器。

I changed 我变了

void HandleSelect(Object o, EventArgs e)
{
  //do something
}

to

void HandleSelect(object o, ExpandableListView.ChildClickEventArgs e)
{
  //do something
}

and it is working. 它正在发挥作用。

Use an onChildClickListener , but you need to call it from the ExpandableListView class, like this: 使用onChildClickListener ,但需要从ExpandableListView类中调用它,如下所示:

lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
        @Override 
        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id)  
        }); 
}

I experienced the same problem. 我遇到了同样的问题。

In my listviewchild I had the xml attribute: 在我的listviewchild中,我有xml属性:

android:clickable="true"

Which silently consumed the event. 哪个人默默地消耗了这个事件。 Removing the attribute enabled the ChildClick Eventhandler. 删除该属性启用了ChildClick Eventhandler。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM