我正在使用无限滚动的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时,是否可以防止可见单元格的闪烁?
答案 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())