防止可见UICollectionView单元格的闪烁

时间:2016-07-27 22:03:29

标签: ios xamarin mvvmcross

我正在使用无限滚动的UICollectionView,它绑定到ViewModel中的自定义ObservableCollection。单元格只有一个UITextView,它可以数据绑定到模型对象中的字符串属性。

当我开始向下滚动时,我通过调用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));
        });
    }
}

新项目已成功添加,但是一旦从通知更改事件重新加载了集合视图,可见单元格项目可能会闪烁并显示错误数据。在将更多数据加载到UICollectionView时,是否可以防止可见单元格的闪烁?

1 个答案:

答案 0 :(得分: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())