NotifyItemRemoved
только удаляет его с дисплея (при отображении или в кеше его представления) и вызывает перемещение (анимацию) других экранных элементов / представлений, вам также потребуетсяфактически удалите резервные данные из вашего адаптера, однако вы храните их.
Например, у меня есть подкласс RecyclerView.Adapter
, который хранит свои данные как ObservableCollection<SomeClass>
в переменной экземпляра, называемой myDataCollection
внутриадаптер.
При инициализации адаптера (для меня .ator
) я регистрирую событие CollectionChanged
на ObservableCollection
, которое я передаю в конструктор, то есть:
myDataCollection.CollectionChanged += CollectionChanged;
Это событие в моем подклассе адаптера определяется как:
void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
NotifyItemRangeInserted(e.NewStartingIndex, e.NewItems.Count);
break;
case NotifyCollectionChangedAction.Remove:
NotifyItemRangeRemoved(e.OldStartingIndex, e.OldItems.Count);
break;
case NotifyCollectionChangedAction.Move:
NotifyItemMoved(e.OldStartingIndex, e.NewStartingIndex);
break;
case NotifyCollectionChangedAction.Replace:
case NotifyCollectionChangedAction.Reset:
NotifyAll();
break;
}
}
Теперь, когда я вносю изменения в ObservableCollection
, адаптер уведомляется об этом изменении и обновляет RecyclerView
, то естьНаблюдение.
Так что теперь вы можете вносить изменения, добавляет / удаляет / перемещает в просто ObservableCollection
и RecyclerView
обновляется автоматически.
Это также работает, если в конечном итоге вы используете Filter
в своем адаптере для реализации функции поиска в RecyclerView
.
Примечание. Это не обновляет раздутые представления в RecyclerView, еслисвойства объектов в пределах ObservableCollection
изменяются, но это может быть сделано через PropertyChangedEventHandler
на ваших объектах, если это необходимо ...