Xuni コントロール > CollectionView > 機能 > ロードオンデマンド |
ロードオンデマンド (インクリメンタルロード、増分読み込み) はモバイルアプリをはじめ、どのようなアプリケーションでも役立つ強力な機能です。Xuni CollectionView は、FlexGrid や ListView などのデータバインドされたコントロールにロードオンデマンド機能を提供します。Xamarin.Forms アプリケーションで増分ロードを利用するには、まず CursorCollectionView クラスを継承した CollectionView のクラスを作成をし、GetPageAsync メソッドをオーバーライドします。このクラスに、ページまたはチャンク単位でデータをロードするロジックを追加します。また、一度にロードするページ数を設定することもできます。
次の図は、ロードオンデマンドを適用した ListBox を示します。
以下のコード例は、Xuni CollectionView を使用した単純な ListView コントロールに対してロードオンデマンド機能を実装する方法を示します。
IncrementalLoading.xaml
をプロジェクトに追加します。<ContentPage></ContentPage>
間のマークアップを以下のように変更します。
XAML |
コードのコピー
|
---|---|
<StackLayout> <ListView x:Name="list" VerticalOptions="FillAndExpand"> <ListView.ItemTemplate> <DataTemplate> <TextCell Text="{Binding ItemName}" Detail="{Binding ItemDateTime, StringFormat='Created: {0}'}" /> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackLayout> |
IncrementalLoading.xaml
ノードを展開し、IncrementalLoading
.xaml.cs
を開いて C# コードビハインドを表示します。
以下のように System.Collections.Generic、System.Threading.Tasks、ColletionView および Xamarin 参照を含めます。
|
C# |
コードのコピー
|
---|---|
public SimpleOnDemand() { InitializeComponent(); // ロードオンデマンド用の CollectionView をインスタンス化します。 SimpleOnDemandCollectionView myCollectionView = new SimpleOnDemandCollectionView(); list.ItemsSource = myCollectionView; // オンデマンドロードを開始します。 list.LoadItemsOnDemand(myCollectionView); } } public class SimpleOnDemandCollectionView : XuniCursorCollectionView<MyDataItem> { public SimpleOnDemandCollectionView() { PageSize = 10; } public int PageSize { get; set; } protected override async Task<Tuple<string, IReadOnlyList<MyDataItem>>> GetPageAsync(string pageToken, int? count = null) { // 新しい項目ページを作成します。 var newItems = new List<MyDataItem>(); for (int i = 0; i < this.PageSize; i++) { newItems.Add(new MyDataItem(this.Count + i)); } return new Tuple<string, IReadOnlyList<MyDataItem>>("token not used", newItems); } } public class MyDataItem { public MyDataItem(int index) { this.ItemName = "My Data Item #" + index.ToString(); this.ItemDateTime = DateTime.Now; } public string ItemName { get; set; } public DateTime ItemDateTime { get; set; } |