RecyclerView适配器 - NotifyItemRemoved - 滚动后再次显示已删除的项目

时间:2018-06-05 02:29:34

标签: android xamarin android-recyclerview xamarin.android

我认为我做错了,但我有一个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 :(得分:1)

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

现在,您可以进行更改添加/删除/移动到只是 ObservableCollectionRecyclerView是“自动神奇地”更新。

如果您最终在适配器中使用FilterRecyclerView中实现搜索功能,这也很有效。

注意:如果ObservableCollection内的对象属性发生变化,则不会更新RecyclerView中的膨胀视图,但如果需要,可以通过PropertyChangedEventHandler对象进行更新...