Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击事件回收视图';t工厂(Xamarin)_C#_Android_Xamarin_Xamarin.android - Fatal编程技术网

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或者别的什么。