using System; using Android.OS; using Android.Support.V7.Widget; using Android.Views; using Android.Widget; using Android.Support.V4.Widget; using Android.App; using Android.Content; namespace ezxamairn.Droid { public class BrowseFragment : Android.Support.V4.App.Fragment, IFragmentVisible { public static BrowseFragment NewInstance() => new BrowseFragment { Arguments = new Bundle() }; BrowseItemsAdapter adapter; SwipeRefreshLayout refresher; ProgressBar progress; public static ItemsViewModel ViewModel { get; set; } public override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Create your fragment here } public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewModel = new ItemsViewModel(); View view = inflater.Inflate(Resource.Layout.fragment_browse, container, false); var recyclerView = view.FindViewById(Resource.Id.recyclerView); recyclerView.HasFixedSize = true; recyclerView.SetAdapter(adapter = new BrowseItemsAdapter(Activity, ViewModel)); refresher = view.FindViewById(Resource.Id.refresher); refresher.SetColorSchemeColors(Resource.Color.accent); progress = view.FindViewById(Resource.Id.progressbar_loading); progress.Visibility = ViewStates.Gone; return view; } public override void OnStart() { base.OnStart(); refresher.Refresh += Refresher_Refresh; adapter.ItemClick += Adapter_ItemClick; if (ViewModel.Items.Count == 0) ViewModel.LoadItemsCommand.Execute(null); } public override void OnStop() { base.OnStop(); refresher.Refresh -= Refresher_Refresh; adapter.ItemClick -= Adapter_ItemClick; } void Adapter_ItemClick(object sender, RecyclerClickEventArgs e) { var item = ViewModel.Items[e.Position]; var intent = new Intent(Activity, typeof(BrowseItemDetailActivity)); intent.PutExtra("data", Newtonsoft.Json.JsonConvert.SerializeObject(item)); Activity.StartActivity(intent); } void Refresher_Refresh(object sender, EventArgs e) { ViewModel.LoadItemsCommand.Execute(null); refresher.Refreshing = false; } public void BecameVisible() { } } class BrowseItemsAdapter : BaseRecycleViewAdapter { ItemsViewModel viewModel; Activity activity; public BrowseItemsAdapter(Activity activity, ItemsViewModel viewModel) { this.viewModel = viewModel; this.activity = activity; this.viewModel.Items.CollectionChanged += (sender, args) => { this.activity.RunOnUiThread(NotifyDataSetChanged); }; } // 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.item_browse; itemView = LayoutInflater.From(parent.Context).Inflate(id, parent, false); var vh = new MyViewHolder(itemView, OnClick, OnLongClick); return vh; } // Replace the contents of a view (invoked by the layout manager) public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { var item = viewModel.Items[position]; // Replace the contents of the view with that element var myHolder = holder as MyViewHolder; myHolder.TextView.Text = item.Text; myHolder.DetailTextView.Text = item.Description; } public override int ItemCount => viewModel.Items.Count; } public class MyViewHolder : RecyclerView.ViewHolder { public TextView TextView { get; set; } public TextView DetailTextView { get; set; } public MyViewHolder(View itemView, Action clickListener, Action longClickListener) : base(itemView) { TextView = itemView.FindViewById(Android.Resource.Id.Text1); DetailTextView = itemView.FindViewById(Android.Resource.Id.Text2); itemView.Click += (sender, e) => clickListener(new RecyclerClickEventArgs { View = itemView, Position = AdapterPosition }); itemView.LongClick += (sender, e) => longClickListener(new RecyclerClickEventArgs { View = itemView, Position = AdapterPosition }); } } }