diff --git a/CollectionViewChallenge/CollectionViewChallenge/AppShell.xaml b/CollectionViewChallenge/CollectionViewChallenge/AppShell.xaml index 9364c60..c8da2dd 100644 --- a/CollectionViewChallenge/CollectionViewChallenge/AppShell.xaml +++ b/CollectionViewChallenge/CollectionViewChallenge/AppShell.xaml @@ -70,9 +70,9 @@ - - - + + + diff --git a/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj b/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj index 3ccfc60..68a81c0 100644 --- a/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj +++ b/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj @@ -20,9 +20,4 @@ MSBuild:UpdateDesignTimeXaml - - - - - \ No newline at end of file diff --git a/CollectionViewChallenge/CollectionViewChallenge/Models/Character.cs b/CollectionViewChallenge/CollectionViewChallenge/Models/Character.cs new file mode 100644 index 0000000..090b8a5 --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge/Models/Character.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CollectionViewChallenge.Models +{ + public class Character + { + public string Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public string UrlImage { get; set; } + public string UrlWiki { get; set; } + } +} diff --git a/CollectionViewChallenge/CollectionViewChallenge/Services/IMarvelService.cs b/CollectionViewChallenge/CollectionViewChallenge/Services/IMarvelService.cs new file mode 100644 index 0000000..fb46550 --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge/Services/IMarvelService.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace CollectionViewChallenge.Services +{ + public interface IMarvelService + { + Task GetCharacterAsync(string id); + Task> GetCharactersAsync(bool forceRefresh = false); + } +} diff --git a/CollectionViewChallenge/CollectionViewChallenge/Services/MarvelService.cs b/CollectionViewChallenge/CollectionViewChallenge/Services/MarvelService.cs new file mode 100644 index 0000000..13248b9 --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge/Services/MarvelService.cs @@ -0,0 +1,126 @@ +using CollectionViewChallenge.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CollectionViewChallenge.Services +{ + public class MarvelService : IMarvelService + { + private List characters; + + public MarvelService() + { + characters = new List(); + var mockItems = new List + { + new Character { + Id = "1009220", + Name = "Captain America", + Description ="Vowing to serve his country any way he could, young Steve Rogers took the super soldier serum to become America's one-man army. Fighting for the red, white and blue for over 60 years, Captain America is the living, breathing symbol of freedom and liberty.", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/3/50/537ba56d31087.jpg" + }, + + new Character { + Id = "1009368", + Name = "Iron Man", + Description ="Wounded, captured and forced to build a weapon by his enemies, billionaire industrialist Tony Stark instead created an advanced suit of armor to save his life and escape captivity. Now with a new outlook on life, Tony uses his money and intelligence to make the world a safer, better place as Iron Man.", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/9/c0/527bb7b37ff55.jpg" + }, + + new Character { + Id = "1009189", + Name = "Black Widow", + Description ="", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/f/30/50fecad1f395b.jpg" + }, + + new Character { + Id = "1009351", + Name = "Hulk", + Description ="Caught in a gamma bomb explosion while trying to save the life of a teenager, Dr. Bruce Banner was transformed into the incredibly powerful creature called the Hulk. An all too often misunderstood hero, the angrier the Hulk gets, the stronger the Hulk gets.", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/5/a0/538615ca33ab0.jpg" + }, + + new Character { + Id = "1009368", + Name = "Spider-Man", + Description ="Bitten by a radioactive spider, high school student Peter Parker gained the speed, strength and powers of a spider. Adopting the name Spider-Man, Peter hoped to start a career using his new abilities. Taught that with great power comes great responsibility, Spidey has vowed to use his powers to help people.", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/3/50/526548a343e4b.jpg" + }, + + new Character { + Id = "1009282", + Name = "Doctor Strange", + Description ="", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/5/f0/5261a85a501fe.jpg" + }, + + new Character { + Id = "1009338", + Name = "Hawkeye", + Description ="", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/e/90/50fecaf4f101b.jpg" + }, + + new Character { + Id = "1009652", + Name = "Thanos", + Description ="The Mad Titan Thanos, a melancholy, brooding individual, consumed with the concept of death, sought out personal power and increased strength, endowing himself with cybernetic implants until he became more powerful than any of his brethren.", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/6/40/5274137e3e2cd.jpg" + }, + + new Character{ + Id = "1009685", + Name = "Ultron", + Description = "Arguably the greatest and certainly the most horrific creation of scientific genius Dr. Henry Pym, Ultron is a criminally insane rogue sentient robot dedicated to conquest and the extermination of humanity.", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/3/70/5261a838e93c0.jpg" + }, + + new Character{ + Id = "1009187", + Name = "Black Panther", + Description = "", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/6/60/5261a80a67e7d.jpg" + }, + + new Character{ + Id = "1010338", + Name = "Captain Marvel (Carol Danvers)", + Description = "", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/6/80/5269608c1be7a.jpg" + }, + + new Character{ + Id = "1009664", + Name = "Thor", + Description = "As the Norse God of thunder and lightning, Thor wields one of the greatest weapons ever made, the enchanted hammer Mjolnir. While others have described Thor as an over-muscled, oafish imbecile, he's quite smart and compassionate. He's self-assured, and he would never, ever stop fighting for a worthwhile cause.", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/d/d0/5269657a74350.jpg" + }, + + new Character{ + Id = "1009407", + Name = "Loki", + Description = "", + UrlImage = "http://i.annihil.us/u/prod/marvel/i/mg/d/90/526547f509313.jpg" + } + }; + + foreach (var item in mockItems) + { + characters.Add(item); + } + } + public async Task GetCharacterAsync(string id) + { + return await Task.FromResult(characters.FirstOrDefault(s => s.Id == id)); + } + + public async Task> GetCharactersAsync(bool forceRefresh = false) + { + return await Task.FromResult(characters); + } + } +} diff --git a/CollectionViewChallenge/CollectionViewChallenge/ViewModels/BaseViewModel.cs b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/BaseViewModel.cs new file mode 100644 index 0000000..1f225d0 --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/BaseViewModel.cs @@ -0,0 +1,54 @@ +using CollectionViewChallenge.Models; +using CollectionViewChallenge.Services; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using Xamarin.Forms; + +namespace CollectionViewChallenge.ViewModels +{ + public class BaseViewModel : INotifyPropertyChanged + { + public IMarvelService MarvelServices => DependencyService.Get>() ?? new MarvelService(); + + bool isBusy = false; + public bool IsBusy + { + get { return isBusy; } + set { SetProperty(ref isBusy, value); } + } + + string title = string.Empty; + public string Title + { + get { return title; } + set { SetProperty(ref title, value); } + } + + protected bool SetProperty(ref T backingStore, T value, + [CallerMemberName]string propertyName = "", + Action onChanged = null) + { + if (EqualityComparer.Default.Equals(backingStore, value)) + return false; + + backingStore = value; + onChanged?.Invoke(); + OnPropertyChanged(propertyName); + return true; + } + + #region INotifyPropertyChanged + public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string propertyName = "") + { + var changed = PropertyChanged; + if (changed == null) + return; + + changed.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + #endregion + } +} \ No newline at end of file diff --git a/CollectionViewChallenge/CollectionViewChallenge/ViewModels/CollectionViewChallengeViewModel.cs b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/CollectionViewChallengeViewModel.cs new file mode 100644 index 0000000..b96a3db --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/CollectionViewChallengeViewModel.cs @@ -0,0 +1,48 @@ +using CollectionViewChallenge.Models; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Text; +using System.Threading.Tasks; +using Xamarin.Forms; + +namespace CollectionViewChallenge.ViewModels +{ + public class CollectionViewChallengeViewModel : BaseViewModel + { + public ObservableCollection Characters { get; set; } + public Command LoadCharactersCommand { get; set; } + + public CollectionViewChallengeViewModel() + { + Title = "Marvel's Super Heroes"; + Characters = new ObservableCollection(); + LoadCharactersCommand = new Command(async () => await ExecuteLoadCharactersCommand()); + } + async Task ExecuteLoadCharactersCommand() + { + if (IsBusy) + return; + + IsBusy = true; + + try + { + Characters.Clear(); + var items = await MarvelServices.GetCharactersAsync(true); + foreach (var item in items) + { + Characters.Add(item); + } + } + catch (Exception ex) + { + //Debug.WriteLine(ex); + } + finally + { + IsBusy = false; + } + } + } +} diff --git a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml index f2da7f7..71705d6 100644 --- a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml +++ b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml @@ -4,29 +4,37 @@ xmlns:d="http://xamarin.com/schemas/2014/forms/design" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" - x:Class="CollectionViewChallenge.Views.CollectionViewChallengePage"> + x:Class="CollectionViewChallenge.Views.CollectionViewChallengePage" + Title="{Binding Title}" + BackgroundColor="Black"> - - - - - - This is a CollectionView! - Your feedback on the experience of converting a ListView to a CollectionView is incredibly appreciated. - Here are three general questions: - 1. How was the experience of converting your existing ListView to a CollectionView? - 2. How is the performance compared to the ListView? - 3. Is there a specific piece of functionality that you'd like to see? - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml.cs b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml.cs index 701124f..6a6ba2e 100644 --- a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml.cs +++ b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml.cs @@ -1,4 +1,5 @@ -using System; +using CollectionViewChallenge.ViewModels; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -12,9 +13,16 @@ namespace CollectionViewChallenge.Views [XamlCompilation(XamlCompilationOptions.Compile)] public partial class CollectionViewChallengePage : ContentPage { + public CollectionViewChallengeViewModel viewModel; public CollectionViewChallengePage() { InitializeComponent(); + BindingContext = viewModel = new CollectionViewChallengeViewModel(); + if (viewModel.Characters.Count == 0) + { + viewModel.LoadCharactersCommand.Execute(null); + collectionViewSource.ItemsSource = viewModel.Characters; + } } } } \ No newline at end of file