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

編集: また、こちらで説明されているソリューションを試してみました。ExpandableListActivity 内の OnChildClick は、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 に答える