带有CardView按钮的Xamarin Android RecyclerView多次点击

时间:2016-06-16 07:36:24

标签: onclick xamarin.android android-recyclerview android-cardview delegation

我正在尝试使用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();
                };
            }

0 个答案:

没有答案