C# 单击事件回收视图';t工厂(Xamarin)
我有回收者的观点 我需要通过点击回收器视图中的元素打开活动 我是这样做的C# 单击事件回收视图';t工厂(Xamarin),c#,android,xamarin,xamarin.android,C#,Android,Xamarin,Xamarin.android,我有回收者的观点 我需要通过点击回收器视图中的元素打开活动 我是这样做的 public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { var layout = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.MovieRow, parent, false);
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
var layout = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.MovieRow, parent, false);
return new MovieViewHolder(layout, OnItemClick);
}
public override int ItemCount
{
get { return movies.Count; }
}
void OnItemClick(int position)
{
if (ItemClick != null)
// _context.StartActivity(typeof(Register));
ItemClick(this, position);
}
像这张在ViewHolder上的照片
public MovieViewHolder(View itemView, Action<int> listener) : base(itemView)
{
MovieNameTextView = itemView.FindViewById<TextView>(Resource.Id.movieNameText);
DirectedByTextView = itemView.FindViewById<TextView>(Resource.Id.directedByText);
Image = itemView.FindViewById<ImageView>(Resource.Id.image);
itemView.Click += (s, e) => listener(Position);
}
publicmovieviewholder(查看项目视图,动作侦听器):基本(项目视图)
{
MovieNameTextView=itemView.FindViewById(Resource.Id.movieNameText);
DirectedByTextView=itemView.FindViewById(Resource.Id.directedByText);
Image=itemView.findviewbyd(Resource.Id.Image);
项目视图。单击+=(s,e)=>listener(位置);
}
但当我在“回收器”视图中单击元素时,什么都没有发生,我的问题在哪里?有点不清楚如何处理
项目单击以及如何将其传播到表面
因此,首先,在您的moviewholder
中,您希望向项目视图的单击事件中添加一个EventHandler
,如图所示。您还应该记得再次删除事件订阅,最好是在Dispose
中删除,以免内存泄漏
比如:
public MovieViewHolder(View itemView, ...) : base(itemView)
{
ItemView.Click += OnItemClick;
}
private void OnItemClick(object s, EventArgs e)
{
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
ItemView.Click -= OnItemClick;
}
}
然后我可能会像大多数MVVM框架一样使用ICommand
来传播操作
public ICommand ItemClick
{
get; set;
}
然后在OnItemClick
中调用命令:
private void OnItemClick(object s, EventArgs e)
{
if (ItemClick == null) return;
if (ItemClick.CanExecute(null))
ItemClick.Execute(null);
}
然后在RecyclerView.Adapter
实现中,您将在OnCreateViewHolder
中分配命令:
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
var vh = new MovieViewHolder(...)
{
Click = ItemClick
};
return vh;
}
您的适配器还将具有一个ItemClick
ICommand
属性,您可以从创建它的视图中设置该属性
public ICommand ItemClick {get; set;}
在你看来:
var recycler = FindViewById<RecyclerView>(...);
var adapter = new MovieAdapter {
ItemClick = ViewModel.ItemClick
};
var recycler=FindViewById(…);
var适配器=新电影适配器{
ItemClick=ViewModel.ItemClick
};
ViewModel.ItemClick
这里只是一个实现ICommand
的实例。如果您不想,您可以将ICommand
改为Action
或类似的内容,以获得回调
请记住,如果您在运行时更改了MovieAdapter.ItemClick
,则在创建了一组ViewHolder之后,您可能会导致不一致,因为旧的ViewHolder会指向您的旧项目Click。在创建此RecyclerView的活动中,您如何处理项目Click
事件?您可以共享完整的代码吗?通过github或者别的什么。