diff --git a/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj b/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj
index d2c42fc..77e06d7 100644
--- a/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj
+++ b/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj
@@ -16,7 +16,7 @@
Resources
Assets
false
- v8.1
+ v9.0
true
Xamarin.Android.Net.AndroidClientHandler
@@ -52,6 +52,15 @@
+
+ 11.0.2
+
+
+ 1.3.0
+
+
+ 3.0.0.5
+
diff --git a/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml b/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml
index 8a8223a..e2341b5 100644
--- a/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml
+++ b/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
-
-
-
+
+
+
\ No newline at end of file
diff --git a/CollectionViewChallenge/CollectionViewChallenge.iOS/CollectionViewChallenge.iOS.csproj b/CollectionViewChallenge/CollectionViewChallenge.iOS/CollectionViewChallenge.iOS.csproj
index 49a7105..1c9c892 100644
--- a/CollectionViewChallenge/CollectionViewChallenge.iOS/CollectionViewChallenge.iOS.csproj
+++ b/CollectionViewChallenge/CollectionViewChallenge.iOS/CollectionViewChallenge.iOS.csproj
@@ -133,6 +133,15 @@
+
+ 11.0.2
+
+
+ 1.3.0
+
+
+ 3.0.0.5
+
diff --git a/CollectionViewChallenge/CollectionViewChallenge/App.xaml.cs b/CollectionViewChallenge/CollectionViewChallenge/App.xaml.cs
index c0a3329..964731f 100644
--- a/CollectionViewChallenge/CollectionViewChallenge/App.xaml.cs
+++ b/CollectionViewChallenge/CollectionViewChallenge/App.xaml.cs
@@ -11,8 +11,8 @@ public partial class App : Application
public App()
{
InitializeComponent();
-
- MainPage = new AppShell();
+ MainPage = new NavigationPage(new CollectionViewChallengePage());
+ //MainPage = new AppShell();
}
protected override void OnStart()
diff --git a/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj b/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj
index 3ccfc60..85472fc 100644
--- a/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj
+++ b/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj
@@ -11,6 +11,9 @@
+
+
+
@@ -19,10 +22,8 @@
MSBuild:UpdateDesignTimeXaml
-
-
-
-
-
+
+ MSBuild:UpdateDesignTimeXaml
+
\ No newline at end of file
diff --git a/CollectionViewChallenge/CollectionViewChallenge/Data/moviedata.json b/CollectionViewChallenge/CollectionViewChallenge/Data/moviedata.json
new file mode 100644
index 0000000..083f107
--- /dev/null
+++ b/CollectionViewChallenge/CollectionViewChallenge/Data/moviedata.json
@@ -0,0 +1,477 @@
+[
+ {
+ "Title": "Batman: The Killing Joke",
+ "Year": "2016",
+ "imdbID": "tt4853102",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTdjZTliODYtNWExMi00NjQ1LWIzN2MtN2Q5NTg5NTk3NzliL2ltYWdlXkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: The Dark Knight Returns, Part 2",
+ "Year": "2013",
+ "imdbID": "tt2166834",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYTEzMmE0ZDYtYWNmYi00ZWM4LWJjOTUtYTE0ZmQyYWM3ZjA0XkEyXkFqcGdeQXVyNTA4NzY1MzY@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: Mask of the Phantasm",
+ "Year": "1993",
+ "imdbID": "tt0106364",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BODE0YTBiMjQtNWQyZC00YTNjLWJmYjAtMWUwNzI4NGVlZTAzL2ltYWdlL2ltYWdlXkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: Year One",
+ "Year": "2011",
+ "imdbID": "tt1672723",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BNTJjMmVkZjctNjNjMS00ZmI2LTlmYWEtOWNiYmQxYjY0YWVhXkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: Assault on Arkham",
+ "Year": "2014",
+ "imdbID": "tt3139086",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BZDU1ZGRiY2YtYmZjMi00ZDQwLWJjMWMtNzUwNDMwYjQ4ZTVhXkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: The Movie",
+ "Year": "1966",
+ "imdbID": "tt0060153",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMmM1OGIzM2UtNThhZS00ZGNlLWI4NzEtZjlhOTNhNmYxZGQ0XkEyXkFqcGdeQXVyNTkxMzEwMzU@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: Gotham Knight",
+ "Year": "2008",
+ "imdbID": "tt1117563",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BM2I0YTFjOTUtMWYzNC00ZTgyLTk2NWEtMmE3N2VlYjEwN2JlXkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Superman/Batman: Apocalypse",
+ "Year": "2010",
+ "imdbID": "tt1673430",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMjk3ODhmNjgtZjllOC00ZWZjLTkwYzQtNzc1Y2ZhMjY2ODE0XkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman Beyond",
+ "Year": "1999–2001",
+ "imdbID": "tt0147746",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYTBiZjFlZDQtZjc1MS00YzllLWE5ZTQtMmM5OTkyNjZjMWI3XkEyXkFqcGdeQXVyMTA1OTEwNjE@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman Beyond: Return of the Joker",
+ "Year": "2000",
+ "imdbID": "tt0233298",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BNmRmODEwNzctYzU1MS00ZDQ1LWI2NWMtZWFkNTQwNDg1ZDFiXkEyXkFqcGdeQXVyNTI4MjkwNjA@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman Begins",
+ "Year": "2005",
+ "imdbID": "tt0372784",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BZmUwNGU2ZmItMmRiNC00MjhlLTg5YWUtODMyNzkxODYzMmZlXkEyXkFqcGdeQXVyNTIzOTk5ODM@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman v Superman: Dawn of Justice",
+ "Year": "2016",
+ "imdbID": "tt2975590",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYThjYzcyYzItNTVjNy00NDk0LTgwMWQtYjMwNmNlNWJhMzMyXkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman",
+ "Year": "1989",
+ "imdbID": "tt0096895",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTYwNjAyODIyMF5BMl5BanBnXkFtZTYwNDMwMDk2._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman Returns",
+ "Year": "1992",
+ "imdbID": "tt0103776",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BOGZmYzVkMmItM2NiOS00MDI3LWI4ZWQtMTg0YWZkODRkMmViXkEyXkFqcGdeQXVyODY0NzcxNw@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman Forever",
+ "Year": "1995",
+ "imdbID": "tt0112462",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BNWY3M2I0YzItNzA1ZS00MzE3LThlYTEtMTg2YjNiOTYzODQ1XkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman & Robin",
+ "Year": "1997",
+ "imdbID": "tt0118688",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMGQ5YTM1NmMtYmIxYy00N2VmLWJhZTYtN2EwYTY3MWFhOTczXkEyXkFqcGdeQXVyNTA2NTI0MTY@._V1_SX300.jpg"
+ },
+ {
+ "Title": "The Lego Batman Movie",
+ "Year": "2017",
+ "imdbID": "tt4116284",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTcyNTEyOTY0M15BMl5BanBnXkFtZTgwOTAyNzU3MDI@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: The Animated Series",
+ "Year": "1992–1995",
+ "imdbID": "tt0103359",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BOTM3MTRkZjQtYjBkMy00YWE1LTkxOTQtNDQyNGY0YjYzNzAzXkEyXkFqcGdeQXVyOTgwMzk1MTA@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: Under the Red Hood",
+ "Year": "2010",
+ "imdbID": "tt1569923",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYTdlODI0YTYtNjk5ZS00YzZjLTllZjktYmYzNWM4NmI5MmMxXkEyXkFqcGdeQXVyNTA4NzY1MzY@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: The Dark Knight Returns, Part 1",
+ "Year": "2012",
+ "imdbID": "tt2313197",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMzIxMDkxNDM2M15BMl5BanBnXkFtZTcwMDA5ODY1OQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Son of Batman",
+ "Year": "2014",
+ "imdbID": "tt3139072",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYjdkZWFhNzctYmNhNy00NGM5LTg0Y2YtZWM4NmU2MWQ3ODVkXkEyXkFqcGdeQXVyNTA0OTU0OTQ@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: Arkham Asylum",
+ "Year": "2009",
+ "imdbID": "tt1282022",
+ "Type": "game",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMWE1MGI0ZmItNzU2My00Mzk5LThkNTMtMmFiMjRiZDNlNzkwXkEyXkFqcGdeQXVyNjgyODQ1Mzk@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Superman/Batman: Public Enemies",
+ "Year": "2009",
+ "imdbID": "tt1398941",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BZDc5NTFiMzgtZWJiOS00N2M1LWJmOGYtZmNjMzFhMzcxZjRiXkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman",
+ "Year": "1966–1968",
+ "imdbID": "tt0059968",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTkzNDY5NTg5MF5BMl5BanBnXkFtZTgwNzI4NzM1MjE@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman: Bad Blood",
+ "Year": "2016",
+ "imdbID": "tt4870838",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BZWZiZmZhYmQtYjVkZi00MWIzLWEzM2MtYzhkNjliNzc2MTMwL2ltYWdlL2ltYWdlXkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman vs. Robin",
+ "Year": "2015",
+ "imdbID": "tt4324274",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMjI0ODY2MDE5Nl5BMl5BanBnXkFtZTgwMTk0NTcyNTE@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman Ninja",
+ "Year": "2018",
+ "imdbID": "tt7451284",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYmFhYzZhYzgtZjZiYS00NWEwLWFhYTUtN2UxM2FmYzdhNDUyXkEyXkFqcGdeQXVyNDk2Nzc1Mg@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman Begins",
+ "Year": "2005",
+ "imdbID": "tt0450392",
+ "Type": "game",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTI3NzczMTk5NF5BMl5BanBnXkFtZTcwNDM5NjEzMQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Batman v Superman: Dawn of Justice",
+ "Year": "2016",
+ "imdbID": "tt2975590",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYThjYzcyYzItNTVjNy00NDk0LTgwMWQtYjMwNmNlNWJhMzMyXkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Superman III",
+ "Year": "1983",
+ "imdbID": "tt0086393",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMzI3ZDllMTctNmI2Mi00OGQ4LTk2ZTQtYTJhMjA5ZGI2YmRkXkEyXkFqcGdeQXVyNjUwNzk3NDc@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Superman/Batman: Apocalypse",
+ "Year": "2010",
+ "imdbID": "tt1673430",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMjk3ODhmNjgtZjllOC00ZWZjLTkwYzQtNzc1Y2ZhMjY2ODE0XkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Superman/Batman: Public Enemies",
+ "Year": "2009",
+ "imdbID": "tt1398941",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BZDc5NTFiMzgtZWJiOS00N2M1LWJmOGYtZmNjMzFhMzcxZjRiXkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Lois & Clark: The New Adventures of Superman",
+ "Year": "1993–1997",
+ "imdbID": "tt0106057",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BZTU1ZGFjNzEtZWYzZC00ZmI0LTg2NmMtN2YyNTY4YzhlODIyXkEyXkFqcGdeQXVyMjExMjk0ODk@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Superman/Doomsday",
+ "Year": "2007",
+ "imdbID": "tt0934706",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BZjU4MzIyZWUtNWQ4Yy00YTU4LTk5NjUtNDBiNDkxZTVlZDgwXkEyXkFqcGdeQXVyNjExODE1MDc@._V1_SX300.jpg"
+ },
+ {
+ "Title": "The Adventures of Young Indiana Jones: Adventures in the Secret Service",
+ "Year": "1999",
+ "imdbID": "tt0250196",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMzI1MDYzODM0MF5BMl5BanBnXkFtZTcwOTYwNjAyMQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "The Adventures of Young Indiana Jones: Daredevils of the Desert",
+ "Year": "1999",
+ "imdbID": "tt0275186",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BZDQ0NGI4ZjktYmQyNC00ZDZhLTgyMGYtYjU1Zjg5N2YzZDRlXkEyXkFqcGdeQXVyNjExODE1MDc@._V1_SX300.jpg"
+ },
+ {
+ "Title": "The Adventures of Young Indiana Jones: Travels with Father",
+ "Year": "1996",
+ "imdbID": "tt0154003",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMjU0NTY3M2UtZGJlYi00MDk4LWE0ZTAtZWI1MzcyZDg3Y2U5XkEyXkFqcGdeQXVyMzU0NzkwMDg@._V1_SX300.jpg"
+ },
+ {
+ "Title": "The Adventures of Young Indiana Jones: Trenches of Hell",
+ "Year": "1999",
+ "imdbID": "tt0250199",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BNzgzMDQxNjY3N15BMl5BanBnXkFtZTcwODQ0NTgxMQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "The Adventures of Young Indiana Jones: Spring Break Adventure",
+ "Year": "1999",
+ "imdbID": "tt0250198",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMzQ5MzI2NTgwMl5BMl5BanBnXkFtZTcwMzQ3MzQyMQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Indiana Jones and the Last Crusade",
+ "Year": "1989",
+ "imdbID": "tt0251138",
+ "Type": "game",
+ "Poster": "https://images-na.ssl-images-amazon.com/images/M/MV5BODZkNzllNGYtODdiMy00NDU0LWE0NDEtMjc4NmZkYjk0MTQzXkEyXkFqcGdeQXVyMDEwMjgxNg@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "The Adventures of Young Indiana Jones: Masks of Evil",
+ "Year": "1999",
+ "imdbID": "tt0250197",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTUwODkwOTYzNV5BMl5BanBnXkFtZTcwNjUyMzMyMQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "The Adventures of Young Indiana Jones: Hollywood Follies",
+ "Year": "1994",
+ "imdbID": "tt0111806",
+ "Type": "movie",
+ "Poster": "https://ia.media-imdb.com/images/M/MV5BMTMyMDgxMzA4Ml5BMl5BanBnXkFtZTcwMjcyMzMyMQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Indiana Jones: Making the Trilogy",
+ "Year": "2003",
+ "imdbID": "tt0395656",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BNDUyZWVmZDItNzYwMy00ZTE1LTk4ZWEtOGU2MTQxY2VkZDVhXkEyXkFqcGdeQXVyNjExODE1MDc@._V1_SX300.jpg"
+ },
+ {
+ "Title": "The Adventures of Young Indiana Jones: The Phantom Train of Doom",
+ "Year": "1999",
+ "imdbID": "tt0278285",
+ "Type": "movie",
+ "Poster": "https://images-na.ssl-images-amazon.com/images/M/MV5BMThlMTAxZGUtMjJiYy00YTJlLWFiMmQtYjY0NGM4NzJkMjRjXkEyXkFqcGdeQXVyNjExODE1MDc@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: Episode IV - A New Hope",
+ "Year": "1977",
+ "imdbID": "tt0076759",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BNzVlY2MwMjktM2E4OS00Y2Y3LWE3ZjctYzhkZGM3YzA1ZWM2XkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: Episode V - The Empire Strikes Back",
+ "Year": "1980",
+ "imdbID": "tt0080684",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYmU1NDRjNDgtMzhiMi00NjZmLTg5NGItZDNiZjU5NTU4OTE0XkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: Episode VI - Return of the Jedi",
+ "Year": "1983",
+ "imdbID": "tt0086190",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BOWZlMjFiYzgtMTUzNC00Y2IzLTk1NTMtZmNhMTczNTk0ODk1XkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: The Force Awakens",
+ "Year": "2015",
+ "imdbID": "tt2488496",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BOTAzODEzNDAzMl5BMl5BanBnXkFtZTgwMDU1MTgzNzE@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: Episode I - The Phantom Menace",
+ "Year": "1999",
+ "imdbID": "tt0120915",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYTRhNjcwNWQtMGJmMi00NmQyLWE2YzItODVmMTdjNWI0ZDA2XkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: Episode III - Revenge of the Sith",
+ "Year": "2005",
+ "imdbID": "tt0121766",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BNTc4MTc3NTQ5OF5BMl5BanBnXkFtZTcwOTg0NjI4NA@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: Episode II - Attack of the Clones",
+ "Year": "2002",
+ "imdbID": "tt0121765",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMDAzM2M0Y2UtZjRmZi00MzVlLTg4MjEtOTE3NzU5ZDVlMTU5XkEyXkFqcGdeQXVyNDUyOTg3Njg@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Rogue One: A Star Wars Story",
+ "Year": "2016",
+ "imdbID": "tt3748528",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMjEwMzMxODIzOV5BMl5BanBnXkFtZTgwNzg3OTAzMDI@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: The Last Jedi",
+ "Year": "2017",
+ "imdbID": "tt2527336",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMjQ1MzcxNjg4N15BMl5BanBnXkFtZTgwNzgwMjY4MzI@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Solo: A Star Wars Story",
+ "Year": "2018",
+ "imdbID": "tt3778644",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BOTM2NTI3NTc3Nl5BMl5BanBnXkFtZTgwNzM1OTQyNTM@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: The Clone Wars",
+ "Year": "2008",
+ "imdbID": "tt1185834",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTI1MDIwMTczOV5BMl5BanBnXkFtZTcwNTI4MDE3MQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: The Clone Wars",
+ "Year": "2008–2019",
+ "imdbID": "tt0458290",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BNjZmMDE2NTctNjNlNC00ZWJhLWJmZjUtZjlkNzljNzkzMmEwXkEyXkFqcGdeQXVyMjg5NDMwMQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars Rebels",
+ "Year": "2014–2018",
+ "imdbID": "tt2930604",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BY2Q1ZTAzNzMtMzlmNy00NjdjLThhYjgtMzgxN2ZkYmFhMDIwXkEyXkFqcGdeQXVyMjg5NDMwMQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Star Wars: Clone Wars",
+ "Year": "2003–2005",
+ "imdbID": "tt0361243",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMzhmNTg1NWYtNTUzNy00NWI0LTk1ZmYtODA1YTE0NGNkYWZkXkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Battlestar Galactica: The Face of the Enemy",
+ "Year": "2008–",
+ "imdbID": "tt1338724",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMDYwOTU0MjYtZjk0NC00NmM4LWFkZWItYWQxZGE4ZTExNjg0XkEyXkFqcGdeQXVyMDM0MzU2NA@@._V1_SX300.jpg"
+ },{
+ "Title": "Battlestar Galactica",
+ "Year": "2004–2009",
+ "imdbID": "tt0407362",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTc1NTg1MDk3NF5BMl5BanBnXkFtZTYwNDYyMjI3._V1_SX300.jpg"
+ },
+ {
+ "Title": "Battlestar Galactica",
+ "Year": "2003",
+ "imdbID": "tt0314979",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BZjJlYzgzOWUtZmJlZi00ZGM4LTliNzctNWFkNThlMDJhZDQxXkEyXkFqcGdeQXVyNTA4NzY1MzY@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Battlestar Galactica: Razor",
+ "Year": "2007",
+ "imdbID": "tt0991178",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTk5MzUxNTYwMF5BMl5BanBnXkFtZTcwNTIyMjU1MQ@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Battlestar Galactica: The Plan",
+ "Year": "2009",
+ "imdbID": "tt1286130",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTgyODE2MjY2OF5BMl5BanBnXkFtZTcwMjQxMTI5Mg@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Battlestar Galactica: Blood & Chrome",
+ "Year": "2012",
+ "imdbID": "tt1704292",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BM2RiNjA4MzctMGU1MC00MThiLTk4OWUtODI4ZmM4MmU3YTllXkEyXkFqcGdeQXVyMDM0MzU2NA@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Battlestar Galactica",
+ "Year": "1978–1979",
+ "imdbID": "tt0076984",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTY4NzQ5MDAwM15BMl5BanBnXkFtZTgwODU0OTkwMDE@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Battlestar Galactica: The Resistance",
+ "Year": "2006–",
+ "imdbID": "tt0840800",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BM2NiN2M3MmUtOWFiZC00M2ZjLWI0MjEtNWU4NmQwNGM5NGQyXkEyXkFqcGdeQXVyMDM0MzU2NA@@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Battlestar Galactica",
+ "Year": "1978",
+ "imdbID": "tt0077215",
+ "Type": "movie",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BYjhhYzBlZjktMmU2Ny00OTIyLThhZjctNTVjMGQxZWQyMzE4XkEyXkFqcGdeQXVyMzU4Nzk4MDI@._V1_SX300.jpg"
+ },
+ {
+ "Title": "Galactica 1980",
+ "Year": "1980",
+ "imdbID": "tt0080221",
+ "Type": "series",
+ "Poster": "https://m.media-amazon.com/images/M/MV5BMTk1ODI1Mzg0MV5BMl5BanBnXkFtZTcwODkxMDU1MQ@@._V1._CR22,35,331,463_SY132_CR2,0,89,132_AL_.jpg_V1_SX300.jpg"
+ }
+]
diff --git a/CollectionViewChallenge/CollectionViewChallenge/Models/Movie.cs b/CollectionViewChallenge/CollectionViewChallenge/Models/Movie.cs
new file mode 100644
index 0000000..efd3217
--- /dev/null
+++ b/CollectionViewChallenge/CollectionViewChallenge/Models/Movie.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
+
+namespace CollectionViewChallenge.Models
+{
+
+ public partial class Movie
+ {
+ [JsonProperty("Title")]
+ public string Title { get; set; }
+
+ [JsonProperty("Year")]
+ public string Year { get; set; }
+
+ [JsonProperty("imbID")]
+ public string imdbID { get; set; }
+
+ [JsonProperty("Type")]
+ public string Type { get; set; }
+
+ [JsonProperty("Poster")]
+ public string Poster { get; set; }
+ }
+
+ public partial class Movie
+ {
+ public static Movie[] FromJson(string json) => JsonConvert.DeserializeObject(json, Converter.Settings);
+ }
+
+ public static class Serialize
+ {
+ public static string ToJson(this Movie[] self) => JsonConvert.SerializeObject(self, Converter.Settings);
+ }
+
+ internal static class Converter
+ {
+ public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
+ {
+ MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
+ DateParseHandling = DateParseHandling.None,
+ Converters = {
+ new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
+ },
+ };
+ }
+
+}
diff --git a/CollectionViewChallenge/CollectionViewChallenge/Services/IDataService.cs b/CollectionViewChallenge/CollectionViewChallenge/Services/IDataService.cs
new file mode 100644
index 0000000..c64c05b
--- /dev/null
+++ b/CollectionViewChallenge/CollectionViewChallenge/Services/IDataService.cs
@@ -0,0 +1,11 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using CollectionViewChallenge.Models;
+
+namespace CollectionViewChallenge.Services
+{
+ public interface IDataService
+ {
+ Task> GetMoviesAsync();
+ }
+}
diff --git a/CollectionViewChallenge/CollectionViewChallenge/Services/WebDataService.cs b/CollectionViewChallenge/CollectionViewChallenge/Services/WebDataService.cs
new file mode 100644
index 0000000..321a4aa
--- /dev/null
+++ b/CollectionViewChallenge/CollectionViewChallenge/Services/WebDataService.cs
@@ -0,0 +1,25 @@
+using CollectionViewChallenge.Models;
+using CollectionViewChallenge.Services;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Xamarin.Forms;
+
+[assembly: Dependency(typeof(WebDataService))]
+namespace CollectionViewChallenge.Services
+{
+ public class WebDataService : IDataService
+ {
+
+ HttpClient httpClient;
+
+ HttpClient Client => httpClient ?? (httpClient = new HttpClient());
+
+ public async Task> GetMoviesAsync()
+ {
+ var json = await Client.GetStringAsync("https://raw.githubusercontent.com/BryanOroxon/CollectionViewChallenge/master/CollectionViewChallenge/CollectionViewChallenge/Data/moviedata.json");
+ var all = Movie.FromJson(json);
+ return all;
+ }
+ }
+}
diff --git a/CollectionViewChallenge/CollectionViewChallenge/ViewModels/BaseViewModel.cs b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/BaseViewModel.cs
new file mode 100644
index 0000000..f0deb73
--- /dev/null
+++ b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/BaseViewModel.cs
@@ -0,0 +1,50 @@
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using Xamarin.Forms;
+using CollectionViewChallenge.Services;
+
+namespace CollectionViewChallenge.ViewModels
+{
+ public class BaseViewModel : INotifyPropertyChanged
+ {
+ public IDataService DataService { get; }
+ public BaseViewModel()
+ {
+ DataService = DependencyService.Get();
+ }
+
+ bool isBusy;
+
+ string title;
+ public string Title
+ {
+ get => title;
+ set
+ {
+ if (title == value)
+ return;
+ title = value;
+ OnPropertyChanged();
+ }
+ }
+ public bool IsBusy
+ {
+ get => isBusy;
+ set
+ {
+ if (isBusy == value)
+ return;
+
+ isBusy = value;
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(IsNotBusy));
+ }
+ }
+
+ public bool IsNotBusy => !IsBusy;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ public void OnPropertyChanged([CallerMemberName]string name = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+ }
+}
diff --git a/CollectionViewChallenge/CollectionViewChallenge/ViewModels/MovieViewModel.cs b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/MovieViewModel.cs
new file mode 100644
index 0000000..46cfece
--- /dev/null
+++ b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/MovieViewModel.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Threading.Tasks;
+using Xamarin.Forms;
+using Xamarin.Essentials;
+
+using System.Linq;
+using CollectionViewChallenge.Models;
+using System.Diagnostics;
+using System.Collections.ObjectModel;
+using MvvmHelpers;
+using System.Windows.Input;
+
+namespace CollectionViewChallenge.ViewModels
+{
+ public class MovieViewModel : BaseViewModel
+ {
+ public ObservableRangeCollection Movies { get; }
+ public Command GetMoviesCommand { get; }
+
+ public MovieViewModel()
+ {
+ Movies = new ObservableRangeCollection();
+ GetMoviesCommand = new Command(async (test) => await GetMoviesAsync(test));
+
+ GetMoviesCommand.Execute("Hello Bryan");
+ }
+
+ async Task GetMoviesAsync(string test)
+ {
+ if (IsBusy)
+ return;
+ try
+ {
+ IsBusy = true;
+ var movies = await DataService.GetMoviesAsync();
+
+ Movies.ReplaceRange(movies);
+
+ Title = $"Movies CollectionView ({Movies.Count})";
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine($"Unable to get movies: {ex.Message}");
+ await Application.Current.MainPage.DisplayAlert("Error!", ex.Message, "OK");
+ }
+ finally
+ {
+ IsBusy = false;
+ }
+ }
+
+ }
+}
diff --git a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml
index f2da7f7..859b08d 100644
--- a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml
+++ b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml
@@ -4,29 +4,40 @@
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"
+ xmlns:viewmodel="clr-namespace:CollectionViewChallenge.ViewModels"
+ xmlns:local="clr-namespace:CollectionViewChallenge"
+ Title="{Binding Title}"
+ >
-
-
-
-
-
- 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..3f5412f 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 MovieViewModel viewModel;
public CollectionViewChallengePage()
{
InitializeComponent();
+ BindingContext = viewModel = new MovieViewModel();
+ if(viewModel.Movies.Count==0)
+ {
+ viewModel.GetMoviesCommand.Execute(null);
+ movieViewSource.ItemsSource = viewModel.Movies;
+ }
}
}
}
\ No newline at end of file
diff --git a/CollectionViewChallenge/CollectionViewChallenge/Views/MainPage.xaml b/CollectionViewChallenge/CollectionViewChallenge/Views/MainPage.xaml
new file mode 100644
index 0000000..92184cf
--- /dev/null
+++ b/CollectionViewChallenge/CollectionViewChallenge/Views/MainPage.xaml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CollectionViewChallenge/CollectionViewChallenge/Views/MainPage.xaml.cs b/CollectionViewChallenge/CollectionViewChallenge/Views/MainPage.xaml.cs
new file mode 100644
index 0000000..25d3f2c
--- /dev/null
+++ b/CollectionViewChallenge/CollectionViewChallenge/Views/MainPage.xaml.cs
@@ -0,0 +1,24 @@
+using CollectionViewChallenge.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms;
+using Xamarin.Forms.Xaml;
+
+namespace CollectionViewChallenge.Views
+{
+ [XamlCompilation(XamlCompilationOptions.Compile)]
+ public partial class MainPage : ContentPage
+ {
+ MovieViewModel mv;
+
+ public MainPage ()
+ {
+ InitializeComponent ();
+ }
+ }
+
+}
\ No newline at end of file