如何解决从活动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 举报,一经查实,本站将立刻删除。