【问题标题】:Xamarin, New activity on itemClick in RecyclerViewXamarin,RecyclerView 中 itemClick 的新活动
【发布时间】:2017-10-29 22:21:45
【问题描述】:

我正在尝试制作Master and Details Application以用于学习目的。

在我的回收站视图中,当我单击项目时,我想开始新活动并将数据发送到新活动。

我在 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。没有任何 Position 字段或属性。 此外,没有 StartActivity 方法可以传递我的意图。

在 recyclerView 中制作 itemClick 并开始新活动的最佳实践是什么?如何处理这个问题?

我是 android 开发的初学者,如果我问一些简单的问题,很抱歉。

【问题讨论】:

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


    【解决方案1】:

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

    那么在你的适配器中应该有一个事件让 Fragment 或 Activity 绑定到:

    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;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多