4

我正在尝试检测和处理 ExpandableListView 中对子项的选择。但是我尝试过的事件处理程序或侦听器似乎都没有触发。我该用哪一个?我试过了:

lv.Click += HandleSelect

lv.ItemClick += HandleSelect

lv.ChildClick += HandleSelect

lv.ItemSelected += HandleSelect

lv.SetOnChildClickListener(new ChildClick)

HandleSelect 事件处理程序

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

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;
        }
}

这是我用来填充 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; }
    }
}

编辑:也刚刚尝试了这里解释的解决方案OnChildClick inside ExpandableListActivity 不会通过在 listviewchild.axml 中将布局和我的所有 TextViews 可聚焦属性设置为 false 来触发,但它仍然不会触发侦听器。

4

3 回答 3

2

我变了

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

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

它正在工作。

于 2012-06-27T18:05:53.210 回答
1

使用onChildClickListener,但您需要从 ExpandableListView 类调用它,如下所示:

lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
        @Override 
        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id)  
        }); 
}
于 2012-06-27T16:46:06.790 回答
0

我遇到了同样的问题。

在我的 listviewchild 中,我有 xml 属性:

android:clickable="true"

默默地消耗了这个事件。删除该属性会启用 ChildClick 事件处理程序。

于 2013-10-16T11:50:00.703 回答