微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从活动C#之外的OnClick事件开始活动

如何解决从活动C#之外的OnClick事件开始活动

我将尽我所能解释自己。 (Xamarin.Android C#)

我有一个名为PhotoAlbumAdapter: RecyclerView.Adapter的类,其中创建,分配和配置了包含客户端图像的RecyclerView的资源,但是该类不在MainActivity: Activity公共类的范围内。

在这里我有一个OnClick方法,当单击RecyclerView中的图像之一时显然会触发该方法,我使用该方法来保存在某些公共/全局变量中选择的图像的ID。我的问题是我不知道如何从OnClick获得的结果来启动另一个类:Activity,在该类中加载我喜欢的那个客户的细节

尝试:

         var Intent = new Android.Content.Intent (this,typeof (Details));
         StartActivity(Intent);

但是,除非它在MainActivity: Activity或其他活动中,否则它不会起作用。该错误告诉我“ StartActivity”在当前上下文中不存在。

除此以外,有什么想法可以触发我的活动Details.cs

我附上代码

    public class PhotoViewHolder : RecyclerView.ViewHolder
        {
            public ImageView Image { get; private set; }
            public TextView Caption { get; private set; }
            public PhotoViewHolder(View itemView,Action<int> listener)
                : base(itemView)
            {
                Image = itemView.FindViewById<ImageView>(Resource.Id.imageView);
                Caption = itemView.FindViewById<TextView>(Resource.Id.textView);
    
                itemView.Click += (sender,e) => listener(base.LayoutPosition);
            }
        }
    
        public class PhotoAlbumAdapter : RecyclerView.Adapter
        {
            public event EventHandler<int> ItemClick;
    
            PhotoAlbum mPhotoAlbum;
    
            public PhotoAlbumAdapter(PhotoAlbum photoAlbum)
            {
                mPhotoAlbum = photoAlbum;
            }
    
            public override RecyclerView.ViewHolder
                OnCreateViewHolder(ViewGroup parent,int viewType)
            {
                View itemView = LayoutInflater.From(parent.Context).
                Inflate(Resource.Layout.LCardView,parent,false);
    
                PhotoViewHolder vh = new PhotoViewHolder(itemView,OnClick);
                return vh;
            }
    
            public override void
                OnBindViewHolder(RecyclerView.ViewHolder holder,int position)
            {
                try
                {
                    PhotoViewHolder vh = holder as PhotoViewHolder;
    
                    vh.Image.SetimageBitmap(GetimageBitmapFromUrl(mPhotoAlbum[position].PhotoID));
                    vh.Caption.Text = mPhotoAlbum[position].Caption;
                }
                catch (Exception Ex)
                {
                string LineErrorNumber = Ex.StackTrace.Substring(Ex.StackTrace.Length - 7,7);
            }
    
        }

        public override int ItemCount
        {
            get { return mPhotoAlbum.NumPhotos; }
        }


void OnClick(int position)
            {
                try
                { 
                    VarGlobal.gIdRecyclerMaterial=(position); 
                    Busqueda.Globales.IdSeleccionado = Convert.ToInt32(mPhotoAlbum[position].TipoMaterial.Substring(2)); 


                       char c = mPhotoAlbum[position].TipoMaterial[0]; 
                        VarGlobal.gNombreMaterialR = Convert.ToString(c);
        
                        //Trigger detalles... 
//Need it here ... ********************************************************************************
                       
                        //var Intent = new Android.Content.Intent(this,typeof(Details));
                        //StartActivity(Intent);
    
                    
                }
                catch (Exception Ex)
                {
                    string LineErrorNumber = Ex.StackTrace.Substring(Ex.StackTrace.Length - 7,7);
                }
            }        
    
            private Bitmap GetimageBitmapFromUrl(string url)
            {
                Bitmap imageBitmap = null;
    
                using (var webClient = new WebClient())
                {
                    var imageBytes = webClient.DownloadData(url);
                    if (imageBytes != null && imageBytes.Length > 0)
                    {
                        imageBitmap = BitmapFactory.DecodeByteArray(imageBytes,imageBytes.Length);
                    }
                }
    
                return imageBitmap;
            }
    
        }
    }

解决方法

适配器不应该对活动或上下文有任何了解。通常,我会使用一个接口来处理适配器行上的单击事件与执行我想要的某些操作之间的回调。

创建一个接口来处理适配器和活动之间的点击事件。

interface OnItemClickListener 
{
  void onItemClick(int position);
}

将其作为参数添加到Adapters构造函数中,并将回调转发到ViewHolder

public PhotoAlbumAdapter(PhotoAlbum photoAlbum,OnItemClickListener clickListener)
{
     mPhotoAlbum = photoAlbum;
     mClickListener = clickListener;
}

public PhotoViewHolder(View itemView,OnItemClickListener listener): base(itemView)
{
     itemView.Click += (sender,e) => listener(base.LayoutPosition);
}

活动扩展接口,在初始化时将clickListener传递给适配器并处理回调

public class MainActivity : OnItemClickListener
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        adapter = PhotoAlbumAdapter(photoAlbum,this)
    }

    ....

    protected override void onItemClick(int position)
    {
         // use item position to get some data to add to the Intent
         var Intent = new Android.Content.Intent (this,typeof (Details));
         StartActivity(Intent);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?