2016-07-08 30 views
1

クリックメソッドを一度だけ呼びたい場合、どうすればこの結果が得られますか?ここ は私のコードです:クリックビュー内でメソッドを呼び出す複数回呼び出される

 public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     View result = convertView; 
     if (result == null) 
     { 
      result = LayoutInflater.From(_Context).Inflate(Resource.Layout.DiagnoseTemplateLayout, null, false); 
     } 
     TextView textView = result.FindViewById<TextView>(Resource.Id.DiagnoseTemplateTextView); 
     textView.Text = _Diagnoses[position].Description; 
     Button button = result.FindViewById<Button>(Resource.Id.DeleteDiagnoseTemplateButton); 
     button.Tag = _Diagnoses[position].Key; 
     button.Click += delegate 
     { 
      if (_Diagnoses[position] != null) 
      { 
       AlertDialog.Builder builder = new AlertDialog.Builder(_Context); 
       builder.SetTitle("Varning"); 
       builder.SetMessage("Delating selected item?"); 
       builder.SetPositiveButton("YES", delegate 
       { 
        SuperBillAddActivity.SuperBill.Diagnoses.Remove(_Diagnoses[position]); 
        SuperBillAddActivity.RefreshLists(); 
       }); 
       builder.SetNegativeButton("NO", delegate { }); 
       builder.Show(); 
      } 
     }; 
     return result; 
    } 

この方法は、位置からボタン我々は_Clicked <

 public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     View result = convertView; 
     if (result == null) 
     { 
      result = LayoutInflater.From(_Context).Inflate(Resource.Layout.DiagnoseTemplateLayout, null, false); 
     } 
     TextView textView = result.FindViewById<TextView>(Resource.Id.DiagnoseTemplateTextView); 
     textView.Text = _Diagnoses[position].Description; 
     Button button = result.FindViewById<Button>(Resource.Id.DeleteDiagnoseTemplateButton); 
     button.Tag = _Diagnoses[position].Key; 
     button.Click += delegate 
     { 
      if ((_Clicked) && (_Diagnoses[position] != null)) 
      { 
       _Clicked = !_Clicked; 
       AlertDialog.Builder builder = new AlertDialog.Builder(_Context); 
       builder.SetTitle("Varning"); 
       builder.SetMessage("Delating selected item?"); 
       builder.SetPositiveButton("YES", delegate 
       { 
        _Clicked = !_Clicked; 
        SuperBillAddActivity.SuperBill.Diagnoses.Remove(_Diagnoses[position]); 
        SuperBillAddActivity.RefreshLists(); 
       }); 
       builder.SetNegativeButton("NO", delegate 
       { 
        _Clicked = !_Clicked; 
       }); 
       builder.Show(); 
      } 
     }; 
     return result; 
    } 

をクリックするところから始まる3回button.Click + =デリゲート と呼ばれている - 私はこれを実装し、今問題は解決しましたが、私はコードを書くこの方法が嫌いです。これに代わる方法はありますか? また、私は最初のコードがそれがしたように働いた理由に興味があります。

+0

私は助け以下の私の答えは、あなたは正しいと、それをマークしてくださいすることができますか?私は感謝します。 – jzeferino

答えて

2

GetViewを複数回呼び出すと、button.Click += delegate倍になることもあります。そして、これがClickであまりにも多くの呼び出しを得る理由です。

試してみてください。

Button button; 
if (result == null) 
{ 
    result = LayoutInflater.From(_Context).Inflate(Resource.Layout.DiagnoseTemplateLayout, null, false); 
    button = result.FindViewById<Button>(Resource.Id.DeleteDiagnoseTemplateButton); 
    button.Click += delegate {...} 

} 
TextView textView = result.FindViewById<TextView>(Resource.Id.DiagnoseTemplateTextView); 
textView.Text = _Diagnoses[position].Description; 
button.Tag = _Diagnoses[position].Key; 
関連する問題