代码之家  ›  专栏  ›  技术社区  ›  Ali Ha Quang

RecyclerView适配器-NotifyItemRemoved-已删除的项目在滚动后再次出现

  •  1
  • Ali Ha Quang  · 技术社区  · 6 年前

    我认为我做的都是错的,但我有一个RecyclerView适配器和简单的按钮点击(在本例中是a) 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 回复  |  直到 6 年前
        1
  •  1
  •   SushiHangover    6 年前

    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;
        }
    }
    

    现在只要我改变一下 可观测收集 ,适配器将收到更改通知并更新 RecyclerView 就是这样。

    所以现在你可以更改添加/删除/移动到 只是 这个 可观测收集 还有 回收视图 是“自动神奇”更新。

    如果你最终使用 Filter 在适配器中实现搜索功能 回收视图 .

    注意:这不会更新RecyclerView中的膨胀视图,如果 可观测收集 改变,但这可以通过 PropertyChangedEventHandler 在你的物品上如果需要。。。