Tornike Gomareli
Tornike Gomareli

Reputation: 1719

Xamarin, New activity on itemClick in RecyclerView

I'm trying to make Master and Details Application for learning purpose.

In my recyclerview, When I click item I want to start new activity and send data to a new activity.

I was making it in listview examples, but I struggled here.

This is my Adapter

using Android.App;
using Android.Widget;
using Android.OS;
using System.Threading.Tasks;
using System;
using System.Threading;
using System.Collections.Generic;
using Android.Content;
using Newtonsoft.Json;
using Petrolium.DataObjects;
using Petrolium.Utilities;
using Petrolium.Activities;
using Android.Support.V7.Widget;
using Android.Views;
using static Android.Support.V7.Widget.RecyclerView;

namespace Petrolium.Adapters
{
    public class CompanyRecyclerAdapter : RecyclerView.Adapter
    {
        static List<Company> _companies = new List<Company>();
        public CompanyRecyclerAdapter(Context context, List<Company> companies) => _companies = companies;

        public override int ItemCount => _companies.Count;

        private class CompanyViewHolder : ViewHolder
        {
            public ImageView companyImageView
            {
                get;
                set;
            }

            public TextView companyNameView
            {
                get;
                set;
            }

            public CompanyViewHolder(View itemView) : base(itemView)
            {

                companyImageView = itemView.FindViewById<ImageView>(Resource.Id.company_image);
                companyNameView = itemView.FindViewById<TextView>(Resource.Id.company_name);

                itemView.Click += (sender, e) =>
                {
                    var context = itemView.Context;
                    Intent intent = new Intent(context, typeof(DetailsActivity));
                    intent.PutExtra(GetText(Resource.String.DetailsStringToJSON),
                                    JsonConvert.SerializeObject(_companies[e.Position].Fuels));

                    StartActivity(intent);
                };
            }
        }


        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            CompanyViewHolder vh = holder as CompanyViewHolder;

            vh.companyImageView.SetImageResource(Resource.Drawable.gulf);
            vh.companyNameView.Text = _companies[position].Name; 
        }

        public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            View itemview = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.Company, parent, false);
            CompanyViewHolder vh = new CompanyViewHolder(itemview);

            return vh;
        }
    }
}

But there isn't GetText method, also e. doesn't have any Position field or property. Also, there isn't StartActivity method to pass my intent on it.

What is best-practice to make itemClick in recyclerView and start a new activity? How to handle this problem?

I'm the beginner in android development and sorry if I'm asking something simple.

Upvotes: 1

Views: 1250

Answers (1)

lowleetak
lowleetak

Reputation: 1382

Your ViewHolder should be just pass out the click event to the Adapter then back to the Fragment or Activity to handle the event.

public CompanyViewHolder(View itemView, Action<int> listener) : base(itemView)
{
    companyImageView = itemView.FindViewById<ImageView>(Resource.Id.company_image);
    companyNameView = itemView.FindViewById<TextView>(Resource.Id.company_name);

    itemView.Click += (sender, e) => listener (base.LayoutPosition);
}

Then in your adapter should have an event to let Fragment or Activity to bind to:

public class CompanyRecyclerAdapter : RecyclerView.Adapter
{
    public event EventHandler<int> ItemClick;

    void OnClick(int position)
    {
        if (ItemClick != null)
            ItemClick(this, position);
    }

    ...

    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        View itemview = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.Company, parent, false);
        CompanyViewHolder vh = new CompanyViewHolder(itemview, OnClick);

        return vh;
    }
}

Then finally in your Fragment or Activity you can bind to the ItemClick event in Adapter to handle it:

mAdapter = new CompanyRecyclerAdapter(mPhotoAlbum);
mAdapter.ItemClick += OnItemClick;

Upvotes: 0

Related Questions