RecyclerView.ViewHolder On Click Items

I'm working with RecyclerView (Xamarin.Android) on Visual Studio 2017, this is my first Xamarin project since I'm a native Android developer, and I'm kinda confused respect to implementing the On Items Clicks events on the Recycler View. I just created the RecyclerView.Adapter using the default template that the IDE provides (RecyclerAdapter class), it looks a lot like the native implementation:

Here my Code:

using System;
using Android.Views;
using Android.Widget;
using Android.Support.V7.Widget;

namespace Airlink
{
    class PdfAdapter : RecyclerView.Adapter
    {
        public event EventHandler<PdfAdapterClickEventArgs> ItemClick;
        public event EventHandler<PdfAdapterClickEventArgs> ItemLongClick;
        Pdf[] items;

        public PdfAdapter(Pdf[] data)
        {
            items = data;
        }

        // Create new views (invoked by the layout manager)            
        public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup   
        parent, int viewType)
        {

            //Setup your layout here
            View itemView = null;
            //var id = Resource.Layout.__YOUR_ITEM_HERE;   
            itemView=LayoutInflater.From(parent.Context).
            Inflate(Resource.Layout.pdf_item, parent, false);  


            var vh = new PdfAdapterViewHolder(itemView, OnClick, 
            OnLongClick);
            return vh;
        }

        // Replace the contents of a view (invoked by the layout manager)
        public override void OnBindViewHolder(RecyclerView.ViewHolder 
        viewHolder, int position)
        {
            var item = items[position];

            // Replace the contents of the view with that element
            PdfAdapterViewHolder holder = viewHolder as 
            PdfAdapterViewHolder;
            holder.pdf_name.Text = items[position].Name;
        }

        public override int ItemCount => items.Length;

        void OnClick(PdfAdapterClickEventArgs args) => 
        ItemClick?.Invoke(this, args);
        void OnLongClick(PdfAdapterClickEventArgs args) => 
        ItemLongClick?.Invoke(this, args);

    }

    public class PdfAdapterViewHolder : RecyclerView.ViewHolder
    {
        public TextView pdf_name { get; set; }


        public PdfAdapterViewHolder(View itemView, 
            Action<PdfAdapterClickEventArgs> clickListener,
            Action<PdfAdapterClickEventArgs> longClickListener) : 
        base(itemView)
        {
            pdf_name = itemView.FindViewById<TextView>
            (Resource.Id.pdf_name);
            itemView.Click += (sender, e) => clickListener(new 
            PdfAdapterClickEventArgs { View = itemView, Position = 
            AdapterPosition });
            itemView.LongClick += (sender, e) => longClickListener(new 
            PdfAdapterClickEventArgs { View = itemView, Position = 
            AdapterPosition });
        }
    }

    public class PdfAdapterClickEventArgs : EventArgs
    {
        public View View { get; set; }
        public int Position { get; set; }


    }
}

So, given my code, I just want to know where I can handle the clicked View, I'm not sure if I have to implement some code on the PdfAdapterClickEventArgs Class or on the OnClick and OnLongClick voids that receive the PdfAdapterClickEventArgs object, let's say I want to show a Toast showing the name of the TextView inside the View clicked. I use to handle this action on native Android using:

  view.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {        

         //my code here
      }
  }

inside the ViewHolder constructor method.

I mean, I can change the default C# implementation in order to get something similar to the snippet above, but I would like to keep the original C# code.

Upvotes: 0

Views: 1499

Answers (1)

pinedax
pinedax

Reputation: 9356

You will implement your OnClick event handler in the Activity/Fragment where instance of your Adapter is created.

This line means you are making the ItemClick event public in your adapter class.

public event EventHandler<PdfAdapterClickEventArgs> ItemClick;

So you are now able to do this:

var adapter = new PdfAdapter(data);
adapter.ItemClick += OnItemClick;
   ....
   ....
myRecyclerView. SetAdapter(adapter);

And you will have a method:

public void OnItemClick(object sender, PdfAdapterClickEventArgs e)
{
   var view = args.View; //this is your view
   Toast.MakeText(this, $"Item Position: {args?.Position}", ToastLength.Short).Show();
}

Hope this helps.

Upvotes: 2

Related Questions