├── infscroll.gif
├── InfiniteScrollDemo
├── InfiniteScrollDemo
│ ├── AssemblyInfo.cs
│ ├── Models
│ │ └── Item.cs
│ ├── AppShell.xaml.cs
│ ├── ViewModels
│ │ ├── ItemDetailViewModel.cs
│ │ ├── AboutViewModel.cs
│ │ ├── BaseViewModel.cs
│ │ └── ItemsViewModel.cs
│ ├── InfiniteScrollDemo.csproj
│ ├── Services
│ │ ├── IDataStore.cs
│ │ └── MockDataStore.cs
│ ├── App.xaml
│ ├── Views
│ │ ├── AboutPage.xaml.cs
│ │ ├── ItemDetailPage.xaml
│ │ ├── ItemDetailPage.xaml.cs
│ │ ├── NewItemPage.xaml
│ │ ├── NewItemPage.xaml.cs
│ │ ├── ItemsPage.xaml.cs
│ │ ├── ItemsPage.xaml
│ │ └── AboutPage.xaml
│ ├── App.xaml.cs
│ └── AppShell.xaml
├── InfiniteScrollDemo.iOS
│ ├── Resources
│ │ ├── Default.png
│ │ ├── tab_about.png
│ │ ├── tab_feed.png
│ │ ├── Default@2x.png
│ │ ├── tab_about@2x.png
│ │ ├── tab_about@3x.png
│ │ ├── tab_feed@2x.png
│ │ ├── tab_feed@3x.png
│ │ ├── xamarin_logo.png
│ │ ├── Default-568h@2x.png
│ │ ├── Default-Portrait.png
│ │ ├── xamarin_logo@2x.png
│ │ ├── xamarin_logo@3x.png
│ │ ├── Default-Portrait@2x.png
│ │ └── LaunchScreen.storyboard
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ │ │ ├── Icon120.png
│ │ │ ├── Icon152.png
│ │ │ ├── Icon167.png
│ │ │ ├── Icon180.png
│ │ │ ├── Icon20.png
│ │ │ ├── Icon29.png
│ │ │ ├── Icon40.png
│ │ │ ├── Icon58.png
│ │ │ ├── Icon60.png
│ │ │ ├── Icon76.png
│ │ │ ├── Icon80.png
│ │ │ ├── Icon87.png
│ │ │ ├── Icon1024.png
│ │ │ └── Contents.json
│ ├── Entitlements.plist
│ ├── Main.cs
│ ├── AppDelegate.cs
│ ├── Info.plist
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── InfiniteScrollDemo.iOS.csproj
└── InfiniteScrollDemo.Android
│ ├── Resources
│ ├── drawable
│ │ ├── tab_about.png
│ │ ├── tab_feed.png
│ │ └── xamarin_logo.png
│ ├── mipmap-hdpi
│ │ ├── icon.png
│ │ └── launcher_foreground.png
│ ├── mipmap-mdpi
│ │ ├── icon.png
│ │ └── launcher_foreground.png
│ ├── mipmap-xhdpi
│ │ ├── icon.png
│ │ └── launcher_foreground.png
│ ├── mipmap-xxhdpi
│ │ ├── icon.png
│ │ └── launcher_foreground.png
│ ├── mipmap-xxxhdpi
│ │ ├── icon.png
│ │ └── launcher_foreground.png
│ ├── mipmap-anydpi-v26
│ │ ├── icon.xml
│ │ └── icon_round.xml
│ ├── values
│ │ ├── colors.xml
│ │ └── styles.xml
│ ├── layout
│ │ ├── Toolbar.xml
│ │ └── Tabbar.xml
│ └── AboutResources.txt
│ ├── Properties
│ ├── AndroidManifest.xml
│ └── AssemblyInfo.cs
│ ├── Assets
│ └── AboutAssets.txt
│ ├── MainActivity.cs
│ └── InfiniteScrollDemo.Android.csproj
├── Readme.md
├── .gitignore
└── InfiniteScrollDemo.sln
/infscroll.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/infscroll.gif
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms.Xaml;
2 |
3 | [assembly: XamlCompilation(XamlCompilationOptions.Compile)]
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_about.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_feed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_feed.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default@2x.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_about@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_about@2x.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_about@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_about@3x.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_feed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_feed@2x.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_feed@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/tab_feed@3x.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/xamarin_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/xamarin_logo.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default-568h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default-568h@2x.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default-Portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default-Portrait.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/xamarin_logo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/xamarin_logo@2x.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/xamarin_logo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/xamarin_logo@3x.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default-Portrait@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Resources/Default-Portrait@2x.png
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | ### Infinite scroll with the Xamarin Forms Collection View
2 |
3 | Here is a demo app showing how to implement infinite scroll with Xamarin Forms' Collection View
4 |
5 | 
6 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/drawable/tab_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/drawable/tab_about.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/drawable/tab_feed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/drawable/tab_feed.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-hdpi/icon.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-mdpi/icon.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xhdpi/icon.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xxhdpi/icon.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xxxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xxxhdpi/icon.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/drawable/xamarin_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/drawable/xamarin_logo.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-hdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-hdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-mdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-mdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xhdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xhdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xxhdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xxhdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coolc0ders/InfinitescrollInCollectionView/HEAD/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/Models/Item.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace InfiniteScrollDemo.Models
4 | {
5 | public class Item
6 | {
7 | public string Id { get; set; }
8 | public string Text { get; set; }
9 | public string Description { get; set; }
10 | }
11 | }
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-anydpi-v26/icon.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFFFFF
4 | #3F51B5
5 | #303F9F
6 | #FF4081
7 |
8 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/mipmap-anydpi-v26/icon_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/AppShell.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | using Xamarin.Forms;
5 |
6 | namespace InfiniteScrollDemo
7 | {
8 | public partial class AppShell : Xamarin.Forms.Shell
9 | {
10 | public AppShell()
11 | {
12 | InitializeComponent();
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/ViewModels/ItemDetailViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | using InfiniteScrollDemo.Models;
4 |
5 | namespace InfiniteScrollDemo.ViewModels
6 | {
7 | public class ItemDetailViewModel : BaseViewModel
8 | {
9 | public Item Item { get; set; }
10 | public ItemDetailViewModel(Item item = null)
11 | {
12 | Title = item?.Text;
13 | Item = item;
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/InfiniteScrollDemo.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0
5 | true
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/layout/Toolbar.xml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Properties/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/ViewModels/AboutViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Input;
3 |
4 | using Xamarin.Forms;
5 |
6 | namespace InfiniteScrollDemo.ViewModels
7 | {
8 | public class AboutViewModel : BaseViewModel
9 | {
10 | public AboutViewModel()
11 | {
12 | Title = "About";
13 |
14 | OpenWebCommand = new Command(() => Device.OpenUri(new Uri("https://xamarin.com/platform")));
15 | }
16 |
17 | public ICommand OpenWebCommand { get; }
18 | }
19 | }
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/Services/IDataStore.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 |
5 | namespace InfiniteScrollDemo.Services
6 | {
7 | public interface IDataStore
8 | {
9 | Task AddItemAsync(T item);
10 | Task UpdateItemAsync(T item);
11 | Task DeleteItemAsync(string id);
12 | Task GetItemAsync(string id);
13 | Task> GetItemsAsync(bool forceRefresh = false, int lastIndex = 0);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/App.xaml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/Views/AboutPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.ComponentModel;
3 | using Xamarin.Forms;
4 | using Xamarin.Forms.Xaml;
5 |
6 | namespace InfiniteScrollDemo.Views
7 | {
8 | // Learn more about making custom code visible in the Xamarin.Forms previewer
9 | // by visiting https://aka.ms/xamarinforms-previewer
10 | [DesignTimeVisible(false)]
11 | public partial class AboutPage : ContentPage
12 | {
13 | public AboutPage()
14 | {
15 | InitializeComponent();
16 | }
17 | }
18 | }
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Main.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | using Foundation;
6 | using UIKit;
7 |
8 | namespace InfiniteScrollDemo.iOS
9 | {
10 | public class Application
11 | {
12 | // This is the main entry point of the application.
13 | static void Main(string[] args)
14 | {
15 | // if you want to use a different Application Delegate class from "AppDelegate"
16 | // you can specify it here.
17 | UIApplication.Main(args, null, "AppDelegate");
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/layout/Tabbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Autosave files
2 | *~
3 |
4 | # build
5 | [Oo]bj/
6 | [Bb]in/
7 | packages/
8 | TestResults/
9 |
10 | # globs
11 | Makefile.in
12 | *.DS_Store
13 | *.sln.cache
14 | *.suo
15 | *.cache
16 | *.pidb
17 | *.userprefs
18 | *.usertasks
19 | config.log
20 | config.make
21 | config.status
22 | aclocal.m4
23 | install-sh
24 | autom4te.cache/
25 | *.user
26 | *.tar.gz
27 | tarballs/
28 | test-results/
29 | Thumbs.db
30 | .vs/
31 |
32 | # Mac bundle stuff
33 | *.dmg
34 | *.app
35 |
36 | # resharper
37 | *_Resharper.*
38 | *.Resharper
39 |
40 | # dotCover
41 | *.dotCover
42 |
43 | # nuget
44 | !nuget/**/*
45 | !/nuget/**/*
46 | !/nuget/
47 | ApiConstants.cs
48 | Xappy/.vscode/settings.json
49 | .idea
50 | global.json
51 | NuGet.Config
52 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Assets/AboutAssets.txt:
--------------------------------------------------------------------------------
1 | Any raw assets you want to be deployed with your application can be placed in
2 | this directory (and child directories) and given a Build Action of "AndroidAsset".
3 |
4 | These files will be deployed with your package and will be accessible using Android's
5 | AssetManager, like this:
6 |
7 | public class ReadAsset : Activity
8 | {
9 | protected override void OnCreate (Bundle bundle)
10 | {
11 | base.OnCreate (bundle);
12 |
13 | InputStream input = Assets.Open ("my_asset.txt");
14 | }
15 | }
16 |
17 | Additionally, some Android functions will automatically load asset files:
18 |
19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
20 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Xamarin.Forms;
3 | using Xamarin.Forms.Xaml;
4 | using InfiniteScrollDemo.Services;
5 | using InfiniteScrollDemo.Views;
6 |
7 | namespace InfiniteScrollDemo
8 | {
9 | public partial class App : Application
10 | {
11 |
12 | public App()
13 | {
14 | InitializeComponent();
15 |
16 | DependencyService.Register();
17 | MainPage = new AppShell();
18 | }
19 |
20 | protected override void OnStart()
21 | {
22 | // Handle when your app starts
23 | }
24 |
25 | protected override void OnSleep()
26 | {
27 | // Handle when your app sleeps
28 | }
29 |
30 | protected override void OnResume()
31 | {
32 | // Handle when your app resumes
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/Views/ItemDetailPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/Views/ItemDetailPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.ComponentModel;
3 | using Xamarin.Forms;
4 | using Xamarin.Forms.Xaml;
5 |
6 | using InfiniteScrollDemo.Models;
7 | using InfiniteScrollDemo.ViewModels;
8 |
9 | namespace InfiniteScrollDemo.Views
10 | {
11 | // Learn more about making custom code visible in the Xamarin.Forms previewer
12 | // by visiting https://aka.ms/xamarinforms-previewer
13 | [DesignTimeVisible(false)]
14 | public partial class ItemDetailPage : ContentPage
15 | {
16 | ItemDetailViewModel viewModel;
17 |
18 | public ItemDetailPage(ItemDetailViewModel viewModel)
19 | {
20 | InitializeComponent();
21 |
22 | BindingContext = this.viewModel = viewModel;
23 | }
24 |
25 | public ItemDetailPage()
26 | {
27 | InitializeComponent();
28 |
29 | var item = new Item
30 | {
31 | Text = "Item 1",
32 | Description = "This is an item description."
33 | };
34 |
35 | viewModel = new ItemDetailViewModel(item);
36 | BindingContext = viewModel;
37 | }
38 | }
39 | }
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/Views/NewItemPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/Views/NewItemPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using Xamarin.Forms;
5 | using Xamarin.Forms.Xaml;
6 |
7 | using InfiniteScrollDemo.Models;
8 |
9 | namespace InfiniteScrollDemo.Views
10 | {
11 | // Learn more about making custom code visible in the Xamarin.Forms previewer
12 | // by visiting https://aka.ms/xamarinforms-previewer
13 | [DesignTimeVisible(false)]
14 | public partial class NewItemPage : ContentPage
15 | {
16 | public Item Item { get; set; }
17 |
18 | public NewItemPage()
19 | {
20 | InitializeComponent();
21 |
22 | Item = new Item
23 | {
24 | Text = "Item name",
25 | Description = "This is an item description."
26 | };
27 |
28 | BindingContext = this;
29 | }
30 |
31 | async void Save_Clicked(object sender, EventArgs e)
32 | {
33 | MessagingCenter.Send(this, "AddItem", Item);
34 | await Navigation.PopModalAsync();
35 | }
36 |
37 | async void Cancel_Clicked(object sender, EventArgs e)
38 | {
39 | await Navigation.PopModalAsync();
40 | }
41 | }
42 | }
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/AppDelegate.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | using Foundation;
6 | using UIKit;
7 |
8 | namespace InfiniteScrollDemo.iOS
9 | {
10 | // The UIApplicationDelegate for the application. This class is responsible for launching the
11 | // User Interface of the application, as well as listening (and optionally responding) to
12 | // application events from iOS.
13 | [Register("AppDelegate")]
14 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
15 | {
16 | //
17 | // This method is invoked when the application has loaded and is ready to run. In this
18 | // method you should instantiate the window, load the UI into it and then make the window
19 | // visible.
20 | //
21 | // You have 17 seconds to return from this method, or iOS will terminate your application.
22 | //
23 | public override bool FinishedLaunching(UIApplication app, NSDictionary options)
24 | {
25 | global::Xamarin.Forms.Forms.SetFlags("CollectionView_Experimental");
26 | global::Xamarin.Forms.Forms.Init();
27 | LoadApplication(new App());
28 |
29 | return base.FinishedLaunching(app, options);
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 | using Android.App;
5 |
6 | // General Information about an assembly is controlled through the following
7 | // set of attributes. Change these attribute values to modify the information
8 | // associated with an assembly.
9 | [assembly: AssemblyTitle("InfiniteScrollDemo.Android")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("InfiniteScrollDemo.Android")]
14 | [assembly: AssemblyCopyright("Copyright © 2014")]
15 | [assembly: AssemblyTrademark("")]
16 | [assembly: AssemblyCulture("")]
17 | [assembly: ComVisible(false)]
18 |
19 | // Version information for an assembly consists of the following four values:
20 | //
21 | // Major Version
22 | // Minor Version
23 | // Build Number
24 | // Revision
25 | //
26 | // You can specify all the values or you can default the Build and Revision Numbers
27 | // by using the '*' as shown below:
28 | // [assembly: AssemblyVersion("1.0.*")]
29 | [assembly: AssemblyVersion("1.0.0.0")]
30 | [assembly: AssemblyFileVersion("1.0.0.0")]
31 |
32 | // Add some common permissions, these can be removed if not needed
33 | [assembly: UsesPermission(Android.Manifest.Permission.Internet)]
34 | [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
35 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/Resources/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
26 |
27 |
30 |
31 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.Android/MainActivity.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | using Android.App;
4 | using Android.Content.PM;
5 | using Android.Runtime;
6 | using Android.Views;
7 | using Android.Widget;
8 | using Android.OS;
9 |
10 | namespace InfiniteScrollDemo.Droid
11 | {
12 | [Activity(Label = "InfiniteScrollDemo", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
13 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
14 | {
15 | protected override void OnCreate(Bundle savedInstanceState)
16 | {
17 | TabLayoutResource = Resource.Layout.Tabbar;
18 | ToolbarResource = Resource.Layout.Toolbar;
19 |
20 | base.OnCreate(savedInstanceState);
21 |
22 | global::Xamarin.Forms.Forms.SetFlags("CollectionView_Experimental");
23 | Xamarin.Essentials.Platform.Init(this, savedInstanceState);
24 | global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
25 | LoadApplication(new App());
26 | }
27 | public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
28 | {
29 | Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
30 |
31 | base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIDeviceFamily
6 |
7 | 1
8 | 2
9 |
10 | UISupportedInterfaceOrientations
11 |
12 | UIInterfaceOrientationPortrait
13 | UIInterfaceOrientationLandscapeLeft
14 | UIInterfaceOrientationLandscapeRight
15 |
16 | UISupportedInterfaceOrientations~ipad
17 |
18 | UIInterfaceOrientationPortrait
19 | UIInterfaceOrientationPortraitUpsideDown
20 | UIInterfaceOrientationLandscapeLeft
21 | UIInterfaceOrientationLandscapeRight
22 |
23 | MinimumOSVersion
24 | 8.0
25 | CFBundleDisplayName
26 | InfiniteScrollDemo
27 | CFBundleIdentifier
28 | com.companyname.InfiniteScrollDemo
29 | CFBundleVersion
30 | 1.0
31 | UILaunchStoryboardName
32 | LaunchScreen
33 | CFBundleName
34 | InfiniteScrollDemo
35 | XSAppIconAssets
36 | Assets.xcassets/AppIcon.appiconset
37 |
38 |
39 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo.iOS/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("InfiniteScrollDemo.iOS")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("InfiniteScrollDemo.iOS")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/ViewModels/BaseViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Runtime.CompilerServices;
5 |
6 | using Xamarin.Forms;
7 |
8 | using InfiniteScrollDemo.Models;
9 | using InfiniteScrollDemo.Services;
10 |
11 | namespace InfiniteScrollDemo.ViewModels
12 | {
13 | public class BaseViewModel : INotifyPropertyChanged
14 | {
15 | public IDataStore- DataStore => DependencyService.Get>();
16 |
17 | bool isBusy = false;
18 | public bool IsBusy
19 | {
20 | get { return isBusy; }
21 | set { SetProperty(ref isBusy, value); }
22 | }
23 |
24 | string title = string.Empty;
25 | public string Title
26 | {
27 | get { return title; }
28 | set { SetProperty(ref title, value); }
29 | }
30 |
31 | protected bool SetProperty(ref T backingStore, T value,
32 | [CallerMemberName]string propertyName = "",
33 | Action onChanged = null)
34 | {
35 | if (EqualityComparer.Default.Equals(backingStore, value))
36 | return false;
37 |
38 | backingStore = value;
39 | onChanged?.Invoke();
40 | OnPropertyChanged(propertyName);
41 | return true;
42 | }
43 |
44 | #region INotifyPropertyChanged
45 | public event PropertyChangedEventHandler PropertyChanged;
46 | protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
47 | {
48 | var changed = PropertyChanged;
49 | if (changed == null)
50 | return;
51 |
52 | changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
53 | }
54 | #endregion
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/InfiniteScrollDemo/InfiniteScrollDemo/Views/ItemsPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.ComponentModel;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 | using Xamarin.Forms;
8 | using Xamarin.Forms.Xaml;
9 |
10 | using InfiniteScrollDemo.Models;
11 | using InfiniteScrollDemo.Views;
12 | using InfiniteScrollDemo.ViewModels;
13 |
14 | namespace InfiniteScrollDemo.Views
15 | {
16 | // Learn more about making custom code visible in the Xamarin.Forms previewer
17 | // by visiting https://aka.ms/xamarinforms-previewer
18 | [DesignTimeVisible(false)]
19 | public partial class ItemsPage : ContentPage
20 | {
21 | ItemsViewModel viewModel;
22 |
23 | public ItemsPage()
24 | {
25 | InitializeComponent();
26 |
27 | BindingContext = viewModel = new ItemsViewModel();
28 | }
29 |
30 | async void OnItemSelected(object sender, SelectedItemChangedEventArgs args)
31 | {
32 | var item = args.SelectedItem as Item;
33 | if (item == null)
34 | return;
35 |
36 | await Navigation.PushAsync(new ItemDetailPage(new ItemDetailViewModel(item)));
37 |
38 | // Manually deselect item.
39 | ItemsCollectionView.SelectedItem = null;
40 | }
41 |
42 | async void AddItem_Clicked(object sender, EventArgs e)
43 | {
44 | await Navigation.PushModalAsync(new NavigationPage(new NewItemPage()));
45 | }
46 |
47 | protected override void OnAppearing()
48 | {
49 | base.OnAppearing();
50 |
51 | if (viewModel.Items.Count == 0)
52 | viewModel.LoadItemsCommand.Execute(null);
53 |
54 | MessagingCenter.Subscribe