2016-07-27 95 views
0

我正在使用無限滾動的UICollectionView綁定到ViewModel中的自定義ObservableCollection。單元格只有一個UITextView,它是模型對象中的字符串屬性的數據綁定。防止可見的UICollectionView單元格閃爍

當我開始向下滾動時,我通過調用OservableCollection上的AddRange來顯示更多的項目。

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可見電池項目可能會閃爍,並顯示一秒鐘錯誤的數據。將更多數據加載到UICollectionView時,是否可以防止可見單元閃爍?

+0

你重新加載整個的CollectionView?不要這樣做。只需添加新聞單元 – Paulw11

+0

@ Paulw11感謝您的建議。是的,我認爲propertyChangeEvent觸發器重新加載整個collectionview。你知道我只能觸發不可見的新細胞重新加載嗎?我可以調用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