public async Task LoadLocalAsync(bool SkipLatest = false, int maxItemCount = 10) { if (IsLoading) { return; } IsLoading = true; if (AppGlobal.RecentList == null) { await AppGlobal.LoadHistoryDataAsync(); } var historyList = AppGlobal.RecentList; for (int i = 0; i < this.Count; ++i) { var hvm = this[i]; var bookmark = historyList.FirstOrDefault(bk => bk.Position.SeriesId == hvm.Position.SeriesId); if (bookmark == null || (SkipLatest && bookmark == historyList[historyList.Count - 1])) //Thus we should remove this item from our collection { this.RemoveAt(i); --i; } } int begin = historyList.Count - 1; if (SkipLatest) { --begin; } for (int idx = 0; idx <= begin; idx++) { var item = historyList[begin - idx]; var hvm = this.FirstOrDefault(vm => vm.Position.SeriesId == item.Position.SeriesId); if (hvm == null) { hvm = new HistoryItemViewModel(item); if (!String.IsNullOrEmpty(item.DescriptionThumbnailUri)) { hvm.CoverImageUri = item.DescriptionThumbnailUri; } this.Insert(idx, hvm); } else { hvm.Position = item.Position; hvm.ProgressPercentage = item.Progress; hvm.CoverImageUri = item.DescriptionImageUri; if (!String.IsNullOrEmpty(item.DescriptionThumbnailUri)) { hvm.CoverImageUri = item.DescriptionThumbnailUri; } hvm.Description = item.ContentDescription; hvm.ChapterTitle = item.ChapterTitle; hvm.VolumeTitle = item.VolumeTitle; hvm.SeriesTitle = item.SeriesTitle; hvm.UpdateTime = item.ViewDate; var oldIdx = this.IndexOf(hvm); // should be greater or equal than idx if (oldIdx != idx) { this.Move(oldIdx, idx); } } if (this.Count >= maxItemCount) // Load the first 10th to show { break; } } AppGlobal.IsHistoryListChanged = false; NotifyPropertyChanged("IsEmpty"); IsLoading = false; IsLoaded = true; }