2017-06-02 89 views
0

我正在使用Visual Studio 2017的RecyclerView(Xamarin.Android),這是我的第一個Xamarin項目,因爲我是一名原生Android開發人員,並且我對實現在物品上點擊Recycler View上的事件。我只是用了IDE提供(RecyclerAdapter類)的默認模板創建的RecyclerView.Adapter,它看上去很像本機實現:RecyclerView.ViewHolder在點擊項目

這裏我的代碼:

using System; 
using Android.Views; 
using Android.Widget; 
using Android.Support.V7.Widget; 

namespace Airlink 
{ 
    class PdfAdapter : RecyclerView.Adapter 
    { 
     public event EventHandler<PdfAdapterClickEventArgs> ItemClick; 
     public event EventHandler<PdfAdapterClickEventArgs> ItemLongClick; 
     Pdf[] items; 

     public PdfAdapter(Pdf[] data) 
     { 
      items = data; 
     } 

     // Create new views (invoked by the layout manager)    
     public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup 
     parent, int viewType) 
     { 

      //Setup your layout here 
      View itemView = null; 
      //var id = Resource.Layout.__YOUR_ITEM_HERE; 
      itemView=LayoutInflater.From(parent.Context). 
      Inflate(Resource.Layout.pdf_item, parent, false); 


      var vh = new PdfAdapterViewHolder(itemView, OnClick, 
      OnLongClick); 
      return vh; 
     } 

     // Replace the contents of a view (invoked by the layout manager) 
     public override void OnBindViewHolder(RecyclerView.ViewHolder 
     viewHolder, int position) 
     { 
      var item = items[position]; 

      // Replace the contents of the view with that element 
      PdfAdapterViewHolder holder = viewHolder as 
      PdfAdapterViewHolder; 
      holder.pdf_name.Text = items[position].Name; 
     } 

     public override int ItemCount => items.Length; 

     void OnClick(PdfAdapterClickEventArgs args) => 
     ItemClick?.Invoke(this, args); 
     void OnLongClick(PdfAdapterClickEventArgs args) => 
     ItemLongClick?.Invoke(this, args); 

    } 

    public class PdfAdapterViewHolder : RecyclerView.ViewHolder 
    { 
     public TextView pdf_name { get; set; } 


     public PdfAdapterViewHolder(View itemView, 
      Action<PdfAdapterClickEventArgs> clickListener, 
      Action<PdfAdapterClickEventArgs> longClickListener) : 
     base(itemView) 
     { 
      pdf_name = itemView.FindViewById<TextView> 
      (Resource.Id.pdf_name); 
      itemView.Click += (sender, e) => clickListener(new 
      PdfAdapterClickEventArgs { View = itemView, Position = 
      AdapterPosition }); 
      itemView.LongClick += (sender, e) => longClickListener(new 
      PdfAdapterClickEventArgs { View = itemView, Position = 
      AdapterPosition }); 
     } 
    } 

    public class PdfAdapterClickEventArgs : EventArgs 
    { 
     public View View { get; set; } 
     public int Position { get; set; } 


    } 
} 

因此,考慮到我的代碼,我只想知道我可以在哪裏處理點擊的視圖,我不確定是否必須在PdfAdapterClickEventArgs類或者接收PdfAdapterClickEventArgs對象的OnClick和OnLongClick空洞上實現一些代碼,假設我想要顯示一個Toast顯示View中單擊的TextView的名稱。我用它來處理原生Android上的這個動作:

view.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) {   

     //my code here 
     } 
    } 

裏面的ViewHolder構造方法。我的意思是,我可以改變默認的C#實現,以獲得類似於上面的代碼片段,但我想保留原始的C#代碼。

回答

1

您將在創建適配器實例的Activity/Fragment中實現您的OnClick事件處理程序。

此行意味着您正在使適配器類中的ItemClick事件公開。

public event EventHandler<PdfAdapterClickEventArgs> ItemClick; 

所以,你現在可以做到這一點:

var adapter = new PdfAdapter(data); 
adapter.ItemClick += OnItemClick; 
    .... 
    .... 
myRecyclerView. SetAdapter(adapter); 

,你將有一個方法:

public void OnItemClick(object sender, PdfAdapterClickEventArgs e) 
{ 
    var view = args.View; //this is your view 
    Toast.MakeText(this, $"Item Position: {args?.Position}", ToastLength.Short).Show(); 
} 

希望這有助於。

+0

是的,沒錯。 –