2017-05-06 75 views
0

我有回收視圖Click事件RecyclerView不工作(Xamarin)

我需要通過點擊元素上回收視圖中打開活動

我不喜歡這樣的適配器

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); 

    } 

但是當我點擊元素在回收站視圖,沒什麼g發生,我的問題在哪裏?

+0

你在用創建這個RecyclerView的Activity中的ItemClick事件做什麼? – apineda

+0

你能分享你的完整代碼嗎?通過github什麼的。 – jzeferino

回答

1

這是有點不清楚你用你的ItemClick做什麼,你如何傳播它的表面。

因此,首先,在您的MovieViewHolder中,您希望爲您的商品視圖的Click事件添加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; 
    } 
} 

然後我可能只是使用ICommand最喜歡MVVM框架做的,傳播的行爲。

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; 
} 

您的適配器也將有一個ItemClickICommand屬性你從你創建它的視圖中設置。

public ICommand ItemClick {get; set;} 

在你看來:

var recycler = FindViewById<RecyclerView>(...); 
var adapter = new MovieAdapter { 
    ItemClick = ViewModel.ItemClick 
}; 

ViewModel.ItemClick這裏只是你實現ICommand的一個實例。如果您不想將ICommand更改爲Action而不是其他類似的東西來取代回撥。

請記住,如果您在稍後的運行時間後更改MovieAdapter.ItemClick,在創建一堆ViewHolder後,您會導致不一致,因爲舊ViewHolder會指向您的舊ItemClick。