public void handleCollectionChanges(IReadOnlyCollection <ICollectionChange> changes) { lock (animationLock) { if (changes.Any(c => c is ReloadCollectionChange)) { tableView.ReloadData(); return; } tableView.BeginUpdates(); foreach (var change in changes) { var affectedSections = new List <int>(); switch (change) { case AddRowCollectionChange <TModel> addRow: var addedToSection = add(addRow); affectedSections.Add(addedToSection); break; case InsertSectionCollectionChange <TModel> insert: insertSection(insert); break; case RemoveRowCollectionChange removeRow: var removedFromSection = remove(removeRow); affectedSections.Add(removedFromSection); break; case MoveRowWithinExistingSectionsCollectionChange <TModel> moveRow: var oldAndNewSection = move(moveRow); affectedSections.AddRange(oldAndNewSection); break; case MoveRowToNewSectionCollectionChange <TModel> moveRowToNewSection: var oldSection = move(moveRowToNewSection); affectedSections.Add(oldSection); break; case UpdateRowCollectionChange <TModel> updateRow: var updatedInSection = update(updateRow); affectedSections.Add(updatedInSection); break; } dataSource.ChangeDisplayedCollection(change); affectedSections .Distinct() .Where(index => index < dataSource.NumberOfSections(tableView)) .ForEach(index => dataSource.RefreshHeader(tableView, index)); } tableView.EndUpdates(); } }
private void handleCollectionChange(ICollectionChange change) { lock (animationLock) { if (change is ReloadCollectionChange) { dataSource.ChangeDisplayedCollection(change); updateTable(change); return; } tableView.BeginUpdates(); dataSource.ChangeDisplayedCollection(change); var sectionsNeedingHeaderRefresh = updateTable(change); tableView.EndUpdates(); sectionsNeedingHeaderRefresh.ForEach(index => dataSource.RefreshHeader(tableView, index)); } }