我正在尝试使用RecyclerView
制作CardViews
。每个CardView
都有多个(4)按钮。该应用程序运行正常,但是如果我按下按钮时按下RecyclerView
,一旦它点击/运行代码多次。
我知道问题是什么,但我无法解决。按钮多次获得delegated
。
那么我怎么需要delegate
我的按钮才能在滚动时只运行它们?
我的RecyclerAdapter
看起来像这样:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Support.V7.Widget;
using MobileApp.Models;
using Android.Support.Design.Widget;
namespace MobileApp
{
public class EvenementRecyclerAdapter : RecyclerView.Adapter
{
private List<Knop> Knoppen;
private RecyclerView mRecyclerView;
private Context mContext;
private string mEvenementNaam;
public EvenementRecyclerAdapter(List<Knop> knoppen, RecyclerView recyclerView, Context context, string evenementNaam)
{
Knoppen = knoppen;
mRecyclerView = recyclerView;
mContext = context;
mEvenementNaam = evenementNaam;
}
public class MyView : RecyclerView.ViewHolder
{
public View mMainView { get; set; }
public TextView mName { get; set; }
public TextView mInfo { get; set; }
public TextView mSales { get; set; }
public Button mBtnOne { get; set; }
public Button mBtnTwo { get; set; }
public Button mBtnFive { get; set; }
public Button mBtnDeleteOne { get; set; }
public MyView(View view) : base(view)
{
mMainView = view;
}
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.CardKnopEvenement, parent, false);
TextView knopNaam = row.FindViewById<TextView>(Resource.Id.knopNaam_cardview);
TextView knopInfo = row.FindViewById<TextView>(Resource.Id.knopInfo_cardview);
TextView aantalVerkocht = row.FindViewById<TextView>(Resource.Id.aantalVerkocht_cardview);
Button buttonOne = row.FindViewById<Button>(Resource.Id.btnOne);
Button buttonTwo = row.FindViewById<Button>(Resource.Id.btnTwo);
Button buttonFive = row.FindViewById<Button>(Resource.Id.btnFive);
Button buttonDeleteone = row.FindViewById<Button>(Resource.Id.btnDeleteOne);
MyView view = new MyView(row) { mName = knopNaam, mInfo = knopInfo, mSales = aantalVerkocht, mBtnOne = buttonOne, mBtnTwo = buttonTwo, mBtnFive = buttonFive, mBtnDeleteOne = buttonDeleteone };
return view;
}
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
MyView myHolder = holder as MyView;
myHolder.mMainView.Click += mMainView_Click;
myHolder.mName.Text = Knoppen[position].Naam;
myHolder.mSales.Text = ConnectionDB.GetVerkochtAantal(mEvenementNaam, myHolder.mName.Text);
//Create button click events
myHolder.mBtnOne.Click += delegate {
Toast.MakeText(mContext, myHolder.mSales.Text, ToastLength.Short).Show();
};
myHolder.mBtnTwo.Click += delegate {
Toast.MakeText(mContext, myHolder.mSales.Text, ToastLength.Short).Show();
};
myHolder.mBtnFive.Click += delegate {
Toast.MakeText(mContext, myHolder.mSales.Text, ToastLength.Short).Show();
};
myHolder.mBtnDeleteOne.Click += delegate {
//Toast.MakeText(mContext, myHolder.mSales.Text, ToastLength.Short).Show();
};
}
void mMainView_Click(object sender, EventArgs e)
{
int position = mRecyclerView.GetChildAdapterPosition((View)sender);
}
public override int ItemCount
{
get { return Knoppen.Count; }
}
}
}
我的应用设计如下: Xamarin Android app with RecyclerView and CardView
我没有找到任何我可以在互联网上使用的东西。提前致谢!
我通过在delegate
周围添加if语句来修复它,以检查它是否有OnClickListener
if (!myHolder.mBtnOne.HasOnClickListeners)
{
myHolder.mBtnOne.Click += delegate {
Toast.MakeText(mContext, myHolder.mSales.Text, ToastLength.Short).Show();
};
}