2017-06-02 6 views
0

私はRecyclerView(Xamarin.Android)をVisual Studio 2017で使用しています。これは私がネイティブのAndroid開発者であるため初めてのXamarinプロジェクトです。アイテムリサイクルビューのイベントをクリックします。私はIDEが提供するデフォルトのテンプレート(RecyclerAdapterクラス)を使用してRecyclerView.Adapterを作成し、それはネイティブ実装のようにたくさん見える:RecyclerView.ViewHolder Clickアイテムについて

ここに私のコード:だから

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のボイドにいくつかのコードを実装する必要があるかどうかはわかりません。トーストを表示したいとしましょうクリックされたビュー内のTextViewの名前を示します。

view.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) {   

     //my code here 
     } 
    } 

ViewHolderコンストラクタメソッド内:私が使用してネイティブのAndroid上でこのアクションを処理するために使用します。

私は、上記のスニペットに似たものを得るために、デフォルトのC#実装を変更できますが、元のC#コードを保持したいと思います。

答えて

1

あなたのアダプタのインスタンスが作成されたアクティビティ/フラグメントに、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

はい、そうです。 –

関連する問題