Xamarin,RecyclerView中itemClick的新活动

时间:2017-10-29 22:21:46

标签: c# android xamarin android-recyclerview xamarin.android

我正在尝试为学习目的制作硕士和详细信息申请。

在我的recyclerview中,当我点击项目时,我想开始新活动并将数据发送到新活动。

我是在listview示例中制作的,但我在这里挣扎。

这是我的适配器

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;
        }
    }
}

但是没有GetText方法,也就是e。没有任何职位字段或属性。 此外,没有StartActivity方法来传递我的意图。

在recyclerView中创建itemClick并开始新活动的最佳做法是什么?如何处理这个问题?

我是Android开发的初学者,对不起,如果我问一些简单的话。

1 个答案:

答案 0 :(得分:0)

您的ViewHolder应该只是将点击事件传递给Adapter,然后返回FragmentActivity来处理事件。

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);
}

然后在您的适配器中应该有一个事件让片段或活动绑定到:

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;
    }
}

然后最后在你的Fragment或Activity中你可以绑定到Adapter中的ItemClick事件来处理它:

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