TopStories を hackernews API から ListView に取得しようとしています。無限スクロールが必要なので、ISupportIncrementalLoading インターフェイスを使用しています。以下は LoadMoreItemsAsync メソッドのコードです。
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(new Uri("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty"));
var json = await response.Content.ReadAsStringAsync();
List<string> topStoriesID = JsonConvert.DeserializeObject<List<string>>(json);
ObservableCollection<RootObject> ro = new ObservableCollection<RootObject>();
do
{
var firstFewItems = (from topItemsID in topStoriesID
select topItemsID).Skip(lastItem).Take((int)count);
foreach (var element in firstFewItems)
{
var itemResponse = await httpClient.GetAsync(new Uri("https://hacker-news.firebaseio.com/v0/item/" + element + ".json?print=pretty"));
itemJson = await itemResponse.Content.ReadAsStringAsync();
ro.Add(JsonConvert.DeserializeObject<RootObject>(itemJson));
lastItem = (int)count;
count = count + count;
}
} while (lastItem != 500);
await coreDispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
foreach (var item in ro)
{
this.Add(item);
}
});
return new LoadMoreItemsResult() { Count = count };
コードを実行すると、エラーのない空白のページが表示されます。URL は 500 個のアイテムを返すので、ここで行っていることは、最初に 500 個のアイテム ID を topStoriesID リストに格納することです。
次に、Skip().Take() メソッドを使用して最初のいくつかのアイテム ID を取得し、この ID で foreach ループを実行して実際のストーリーを取得し、それらを ObservableCollection オブジェクト ro に追加します。lastItem が 500 に達するまでこれを続けます。
このコードは正しいですか、それともより良い実装方法はありますか?