Member 4345489 Ответов: 1

Несколько раз нажмите кнопку события в пользовательский элемент управления ListView адаптер в Xamarin для Android


Я использовал ListView с пользовательского элемента управления ListView адаптер и у меня генерируется событие click для управления графическое представление пользовательского адаптера. Теперь проблема в том, что мое событие щелчка срабатывает несколько раз с разной позицией.
Вот какой код я пробовал до сих пор :-

<pre lang="C#">
public override View GetView(int position, View convertView, ViewGroup parent)
		{
			try {
				ProductViewHolder holder = null;
				RetriveState();

				if(convertView == null)
				{
					holder = new ProductViewHolder();
					convertView = context.LayoutInflater.Inflate(Resource.Layout.ProductListTabView,parent,false);
					holder.ivPlus = convertView.FindViewById<ImageView> (Resource.Id.ivPlus); 
					convertView.Tag = holder;
				}
				else 
					holder = (ProductViewHolder)convertView.Tag;

				var item = itemsList.ElementAt(position);
			  
				//this is where i am facing the issue coz it fires multiple times
				holder.ivPlus.Click +=  delegate  {
					ProgressDialog progressDialog = ProgressDialog.Show (context, "", "Loading Data.."); 
					int currentQty = item.Quantity; //Convert.ToInt32(holder.tvQty.Text);
					holder.tvQty.Text = (currentQty + 1).ToString(); 
					itemsList.ElementAt(position).Quantity = Convert.ToInt32(holder.tvQty.Text);
					progressDialog.Dismiss(); 
				};
			}
		}


Может ли кто-нибудь сказать мне, что я здесь делаю не так?

1 Ответов

Рейтинг:
0

Member 13135083

Привет,

У меня была похожая проблема,и я исправил ее с помощью шаблона ViewHolder. Вы, кажется, уже используете его, поэтому я хотел бы показать вам, как я его инициализирую.

public override View GetView(int position, View convertView, ViewGroup parent)
{
    ProductViewHolder holder = null;
    RetrieveState();

    if (convertView == null)
        holder = view.Tag as ProductViewHolder;
    if (holder == null)
    {
        holder = new ProductViewHolder();
        convertView = context.LayoutInflater.Inflate(
                Resource.Layout.ProductListTabView,parent,false);
        ...
        holder.Tag = holder;
    }
}

Таким образом, держатель не будет повторно инициализирован несколько раз, даже если convertView должны были измениться на null в более позднее время. Держатель работает как синглтон, если вы знакомы с этим шаблоном, поскольку он гарантированно будет создан только один раз. И поэтому утверждение
holder.ivPlus.Click += delegate {... }

позвонят только один раз.

В C# вы добавляете указатель функции (делегат) в обработчик событий с помощью оператора+=. В вашем случае вы добавляете новый указатель функции в обработчик для вызова каждый раз convertView является null, что привело к тому, что казалось, что было запущено несколько событий щелчка.
Нет никакого способа назначить только один указатель функции обработчику событий, он работает как список, к которому вы можете добавить либо += или удалить с помощью -=.