ImageAdapter.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using Android.Views;
  3. using Android.Widget;
  4. using Android.Support.V7.Widget;
  5. using ImageSearch.ViewModel;
  6. using Android.App;
  7. using Square.Picasso;
  8. namespace ImageSearch.Droid.Adapters
  9. {
  10. class ImageAdapter : RecyclerView.Adapter
  11. {
  12. public event EventHandler<ImageAdapterClickEventArgs> ItemClick;
  13. public event EventHandler<ImageAdapterClickEventArgs> ItemLongClick;
  14. ImageSearchViewModel viewModel;
  15. Activity activity;
  16. public ImageAdapter(Activity activity, ImageSearchViewModel viewModel)
  17. {
  18. this.viewModel = viewModel;
  19. this.activity = activity;
  20. this.viewModel.Images.CollectionChanged += (sender, args) =>
  21. {
  22. this.activity.RunOnUiThread(NotifyDataSetChanged);
  23. };
  24. }
  25. // Create new views (invoked by the layout manager)
  26. public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
  27. {
  28. //Setup your layout here
  29. View itemView = null;
  30. var id = Resource.Layout.item;
  31. itemView = LayoutInflater.From(parent.Context).
  32. Inflate(id, parent, false);
  33. var vh = new ImageAdapterViewHolder(itemView, OnClick, OnLongClick);
  34. return vh;
  35. }
  36. // Replace the contents of a view (invoked by the layout manager)
  37. public override void OnBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)
  38. {
  39. var item = viewModel.Images[position];
  40. // Replace the contents of the view with that element
  41. var holder = viewHolder as ImageAdapterViewHolder;
  42. holder.Caption.Text = item.Title;
  43. Picasso.With(activity).Load(item.ImageLink).Into(holder.Image);
  44. }
  45. public override int ItemCount => viewModel.Images.Count;
  46. void OnClick(ImageAdapterClickEventArgs args) => ItemClick?.Invoke(this, args);
  47. void OnLongClick(ImageAdapterClickEventArgs args) => ItemLongClick?.Invoke(this, args);
  48. }
  49. public class ImageAdapterViewHolder : RecyclerView.ViewHolder
  50. {
  51. public ImageView Image { get; private set; }
  52. public TextView Caption { get; private set; }
  53. public ImageAdapterViewHolder(View itemView, Action<ImageAdapterClickEventArgs> clickListener,
  54. Action<ImageAdapterClickEventArgs> longClickListener) : base(itemView)
  55. {
  56. Image = itemView.FindViewById<ImageView>(Resource.Id.imageView);
  57. Caption = itemView.FindViewById<TextView>(Resource.Id.textView);
  58. itemView.Click += (sender, e) => clickListener(new ImageAdapterClickEventArgs { View = itemView, Position = AdapterPosition });
  59. itemView.LongClick += (sender, e) => longClickListener(new ImageAdapterClickEventArgs { View = itemView, Position = AdapterPosition });
  60. }
  61. }
  62. public class ImageAdapterClickEventArgs : EventArgs
  63. {
  64. public View View { get; set; }
  65. public int Position { get; set; }
  66. }
  67. }