2015-02-27 3 views
0

По какой-то причине мой обработчик события Checkbox.Click дважды вызывается в моем адаптере Custom ListView Xamarin.Android. Я предоставляю свой метод GetView ниже для любой справки или указателя в том, что я делаю неправильно.Checkbox Click Event Handler Called Twice

public override View GetView(int position, View convertView, ViewGroup parent) 
     { 
      ServiceViewHolder holder = null; 
      var view = convertView; 

      if (view == null) 
      { 
       view = Context.LayoutInflater.Inflate(Resource.Layout.ListRowService, null); 

       holder = new ServiceViewHolder 
       { 
        Name = view.FindViewById<TextView>(Resource.Id.tvServiceName), 
        Price = view.FindViewById<TextView>(Resource.Id.tvServicePrice), 
        SelectCheckbox = view.FindViewById<CheckBox>(Resource.Id.checkboxAdd)      
       }; 

       view.Tag = holder; 
      } 
      else 
      { 
        holder = view.Tag as ServiceViewHolder; 
      } 

      var tempServiceItem = ServiceItems[position]; 
      holder.Name.Text = tempServiceItem.Name;    
      holder.SelectCheckbox.Click += (o, e) => 
      { 
       if (holder.SelectCheckbox.Checked) 
       { 
        var myActivity = (ServicesListActivity) Context; 
        myActivity.OnServiceSelected(tempServiceItem, true); 
       } 
       else 
       { 
        var myActivity = (ServicesListActivity) Context; 
        myActivity.OnServiceSelected(tempServiceItem, false); 
       } 
      }; 
      return view; 
     } 

     private class ServiceViewHolder : Java.Lang.Object 
     { 
      public TextView Name { get; set; } 
      public TextView Price { get; set; } 
      public CheckBox SelectCheckbox { get; set; } 
     } 

И только уточнить, цель этого обработчика события Checkbox.Click его для того чтобы передать выбранный элемент в деятельности, которую он делает, но тогда он называет себя снова за каждый клик после первого щелчка.

ответ

1

Вы уверены, что GetView вызывается только один раз? Если нет, привязка события щелчка будет стекаться. Переместите привязку события клика или убедитесь, что он связан только один раз.

public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     ServiceViewHolder holder = null; 
     var view = convertView; 

     if (view == null) 
     { 
      view = Context.LayoutInflater.Inflate(Resource.Layout.ListRowService, null); 

      holder = new ServiceViewHolder 
      { 
       Name = view.FindViewById<TextView>(Resource.Id.tvServiceName), 
       Price = view.FindViewById<TextView>(Resource.Id.tvServicePrice), 
       SelectCheckbox = view.FindViewById<CheckBox>(Resource.Id.checkboxAdd)      
      }; 

      view.Tag = holder; 
      holder.SelectCheckbox.Tag = holder; 

      holder.SelectCheckbox.Click += (o, e) => 
      { 
       var h = (ServiceViewHolder)((CheckBox)o).Tag; 
       var tempServiceItem = ServiceItems[h.Position]; 
       h.Name.Text = tempServiceItem.Name; 

       if (h.SelectCheckbox.Checked) 
       { 
        var myActivity = (ServicesListActivity) Context; 
        myActivity.OnServiceSelected(tempServiceItem, true); 
       } 
       else 
       { 
        var myActivity = (ServicesListActivity) Context; 
        myActivity.OnServiceSelected(tempServiceItem, false); 
       } 
      }; 
     } 
     else 
     { 
       holder = (ServiceViewHolder)view.Tag; 
     } 

     holder.Position = position; 


     return view; 
    } 

    private class ServiceViewHolder : Java.Lang.Object 
    { 
     public TextView Name { get; set; } 
     public TextView Price { get; set; } 
     public CheckBox SelectCheckbox { get; set; } 
     publit int Position{get;set;} 
    } 
+0

Большое вам спасибо, это указывает на меня в правильном направлении, но h.Position дает мне ошибку компиляции. –

0

За этим Xamarin сообщение в форуме http://forums.xamarin.com/discussion/comment/27030/#Comment_27030 я понял, что я звоню обработчик события Checkbox дважды, так что я вновь учитываться его можно только раз, как так.

if (convertView == null) 
      { 
       convertView = Context.LayoutInflater.Inflate(Resource.Layout.ListRowService, null); 

       holder = new ServiceViewHolder 
       { 
        Name = convertView.FindViewById<TextView>(Resource.Id.tvServiceName), 
        Price = convertView.FindViewById<TextView>(Resource.Id.tvServicePrice), 
        Category = convertView.FindViewById<TextView>(Resource.Id.tvServiceCategory), 
        EditButton = convertView.FindViewById<ImageButton>(Resource.Id.buttonEditService), 
        DeleteButton = convertView.FindViewById<ImageButton>(Resource.Id.buttonDeleteService), 
        SelectCheckbox = convertView.FindViewById<CheckBox>(Resource.Id.checkboxAdd) 

       }; 

       holder.SelectCheckbox.Click += (o, e) => mFragment.OnServiceSelected(tempServiceItem, holder.SelectCheckbox.Checked); 

       convertView.Tag = holder; 
      } 
      else 
      { 
       holder = (ServiceViewHolder)convertView.Tag; 
      } 

      //var tempServiceItem = new ServiceItem(); 
      holder.Name.Text = tempServiceItem.Name; 
      holder.Category.Text = tempServiceItem.Category; 
      holder.Price.Text = String.Format("{0:C}", tempServiceItem.Price); 
      holder.DeleteButton.Click += (object sender, EventArgs e) => 
      { 
       ServiceItems.Remove(tempServiceItem); 
       ServicesManager.DeleteServiceItem(tempServiceItem.Id); 

       //Then refresh the screen to show the item has been removed 
       NotifyDataSetChanged(); 

      }; 
      holder.EditButton.Click += (object sender, EventArgs e) => 
      { 

      };