RecyclerView Adapter - NotifyItemRemoved - удаленный элемент снова появляется после прокрутки - PullRequest
0 голосов
/ 05 июня 2018

Я думаю, что я все делаю неправильно, но у меня есть адаптер RecyclerView и простой щелчок кнопки (в данном случае LinearLayout), который вызывает следующее

this.NotifyItemRemoved(position);

Полный код кнопки - этоследующий

public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
..........
        LinearLayout _ARC = V.FindViewById<LinearLayout>(Resource.Id.moreArc);
        _ARC.Click += async delegate {
        try
        {
          Log.Info("101029", "ARC_Clicked");
          await usersAct.SWITCH_ARCHIVE(ID); // some user action
          this.NotifyItemRemoved(position);                   
        }
        catch (Exception X)
        {
          Log.Info("101029", "ERROR AT ARC_Clicked: " + X.Message);
        }
        };
.......
}

Это работает нормально, и элемент удаляется удачно, но когда я прокручиваю вниз в recyclerview и возвращаюсь к позиции, откуда элемент был удален, элемент появляется обратно.

Мне кажется, я все делаю неправильно или моя логика неверна?Есть идеи?

1 Ответ

0 голосов
/ 05 июня 2018

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 на ваших объектах, если это необходимо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...