简体   繁体   中英

ExpandableListView Child Events

I am trying to detect and handle the selection of a child in an 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

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

ChildClick listener

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

 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.

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:

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:

android:clickable="true"

Which silently consumed the event. Removing the attribute enabled the ChildClick Eventhandler.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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