2016-07-27 2 views
0

Я использую бесконечный прокручиваемый UICollectionView, который привязан к пользовательскому ObservableCollection, который находится в ViewModel. Ячейка имеет только UITextView, которая привязывается к атрибуту string в объекте модели.Предотвращение мерцания видимых ячеек UICollectionView

Когда я начинаю прокручивать вниз, я показываю больше предметов, вызывая AddRange на OservableCollection.

public class MyCollection<T> : ObservableCollection<T> 
{ 
    public MyCollection() 
     : base() 
    { 
    } 

    public MyCollection(IEnumerable<T> collection) 
     : base(collection) 
    { 
    } 

    public MyCollection(List<T> list) 
     : base(list) 
    { 
    } 

    public void AddRange(IEnumerable<T> range) 
    { 
     foreach (var item in range) 
     {    
      Items.Add(item); 
     } 

     var dispatcher = Mvx.Resolve<IMvxMainThreadDispatcher>(); 
     dispatcher.RequestMainThreadAction(() => 
     { 
      this.OnPropertyChanged(new PropertyChangedEventArgs("Count")); 
      this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]")); 
      this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, range)); 
     }); 
    } 
} 

Новые элементы добавляются успешно, однако после того, как CollectionView get's Reloaded от события изменения уведомления видимых элементов клеток могут мерцать и показывать неправильные данные доли секунды. Можно ли предотвратить мерцание видимых ячеек при загрузке большего количества данных в UICollectionView?

+0

Вы перезагрузки всей CollectionView? Не делай этого. Просто добавьте новостные ячейки – Paulw11

+0

@ Paulw11 благодарит за предложения. Да, я полагаю, что свойствоChangeEvent запускает перезагрузку всей коллекции. Вы знаете, как я могу только вызвать перезагрузку новых ячеек, которые не видны? Я мог бы вызвать collectionView.ReloadItems (indexPaths []), но я не знаю, как я могу получить индексные пути для новых элементов. – doorman

ответ

1

Вы можете создать массив IndexPath[] перейти в collectionView.ReloadItems(indexPaths[]), делая это:

public void AddRange(IEnumerable<T> range) 
{ 
    ... 
    ... 
    ... 

    var originalCount = Count; 

    foreach (var item in range) 
    {    
     Items.Add(item); 
    } 

    List<NSIndexPath> reloadPaths = new List<NSIndexPath>(); 
    for (int i = originalCount; i < Count-1; i++) { 
     reloadPaths.Add(NSIndexPath.FromRowSection(i, 0)); 
    } 

    ... 
    ... 
    ... 
} 

Затем вы можете выполнить collectionView.ReloadItems(reloadPaths.ToArray())

+0

Спасибо, я попробую это ... – doorman

Смежные вопросы