C# Xamarin Android ListView-删除按钮多次触发
为我需要能够从中删除的列表视图设置客户适配器。GetView看起来像这样,包括my view holder的代码C# Xamarin Android ListView-删除按钮多次触发,c#,android,xamarin,xamarin.android,C#,Android,Xamarin,Xamarin.android,为我需要能够从中删除的列表视图设置客户适配器。GetView看起来像这样,包括my view holder的代码 public override View GetView(int position, View convertView, ViewGroup parent) { var row = convertView; IngredientHolder holder = null; if (row == null) {
public override View GetView(int position, View convertView, ViewGroup parent)
{
var row = convertView;
IngredientHolder holder = null;
if (row == null)
{
row = _context.LayoutInflater.Inflate(Resource.Layout.EditableIngredientListViewItem, null);
holder = new IngredientHolder
{
IngredientName = row.FindViewById<EditText>(Resource.Id.editableIngredientNameTextView),
Measurement = row.FindViewById<EditText>(Resource.Id.measurement),
DeleteButton = row.FindViewById<ImageButton>(Resource.Id.delete_ingredient)
};
row.Tag = holder;
}
else
{
holder = row.Tag as IngredientHolder;
}
var ingredient = IngredientList[position];
holder.Measurement.Text = ingredient.Measurement;
holder.IngredientName.Text = ingredient.Name;
holder.DeleteButton.Click += (sender, args) =>
{
IngredientList.RemoveAt(position);
NotifyDataSetChanged();
};
return row;
}
private class IngredientHolder : Java.Lang.Object
{
public TextView IngredientName { get; set; }
public TextView Measurement { get; set; }
public ImageButton DeleteButton { get; set; }
}
public override View GetView(int位置、视图转换视图、视图组父视图)
{
var行=convertView;
IngredientHolder=null;
if(行==null)
{
行=_context.LayoutInflater.Inflate(Resource.Layout.EditableIngredientListViewItem,null);
支架=新的支架
{
IngredientName=row.FindViewById(Resource.Id.editableIngredientNameTextView),
度量=行.findviewbyd(Resource.Id.Measurement),
DeleteButton=row.findviewbyd(Resource.Id.delete\u)
};
row.Tag=holder;
}
其他的
{
holder=行。标记为IngredientHolder;
}
var成分=IngCreditList[位置];
holder.Measurement.Text=成分.Measurement;
holder.IngreditName.Text=成分名称;
holder.DeleteButton.Click+=(发件人,参数)=>
{
InCreditList.RemoveAt(位置);
NotifyDataSetChanged();
};
返回行;
}
私有类IngreditionHolder:Java.Lang.Object
{
公共文本视图IngredientName{get;set;}
公共文本视图度量{get;set;}
公共图像按钮删除按钮{get;set;}
}
但问题是,当我单击一个删除按钮时,它会多次触发不同的位置,最终到达一个点,在该点上我已从列表中删除了项,并且位置的值超出范围,我得到一个异常
从列表视图中删除项目的正确方法是什么?用下面的代码替换代码,这样它就不会调用很多次
if (! holder.DeleteButton.HasOnClickListeners)
{
holder.DeleteButton.Click += (sender, args) =>
{
IngredientList.RemoveAt(holder.AdapterPosition);
NotifyDataSetChanged();
};
}