我认为我做错了,但我有一个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
向下滚动并返回到项目被移除的位置时,该项目会显示回来。
我认为我做错了或者我的逻辑不正确?有什么想法吗?
答案 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
。
现在,您可以进行更改添加/删除/移动到只是 ObservableCollection
,RecyclerView
是“自动神奇地”更新。
如果您最终在适配器中使用Filter
在RecyclerView
中实现搜索功能,这也很有效。
注意:如果ObservableCollection
内的对象属性发生变化,则不会更新RecyclerView中的膨胀视图,但如果需要,可以通过PropertyChangedEventHandler
对象进行更新...