多次调用Getview里面的方法

Kob*_*bra 2 methods android xamarin getview

我希望 click 方法只被调用一次,我该怎么做才能得到这个结果?这是我的代码:

        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;
    }
Run Code Online (Sandbox Code Playgroud)

这个方法被调用 3 次 button.Click += 委托从我们点击按钮的位置开始

        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;
    }
Run Code Online (Sandbox Code Playgroud)

_Clicked <- 我实现了这个,现在问题解决了,但我不喜欢这种放置代码的方式。有没有替代方案?另外,我对为什么第一个代码按它的方式工作很感兴趣。

jze*_*ino 5

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;
Run Code Online (Sandbox Code Playgroud)