从子列表中删除对象已删除的android
Posted
技术标签:
【中文标题】从子列表中删除对象已删除的android【英文标题】:Remove object from list on child removed android 【发布时间】:2019-08-10 00:01:53 【问题描述】:我有一个类对象的arrayList。 此类包含从 Firebase 接收的数据。
但是我想在 firebase 中删除一个子对象时从列表中删除一个对象,但是两个对象不匹配,因为快照创建了一个包含相同数据的类的新对象。这是我实现的代码:
posts = new ArrayList<>();
childEventListener= new ChildEventListener()
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
posts.add(dataSnapshot.getValue(GalleryPostModel.class));
unapprovedAdapter.notifyDataSetChanged();
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot)
posts.remove(dataSnapshot.getValue(GalleryPostModel.class));
unapprovedAdapter.notifyDataSetChanged();
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
;
UnApprovedDbRef.addChildEventListener(childEventListener);
那么我该如何解决这个问题呢?我该怎么做才能将其从列表中删除。我可以在列表中进行线性搜索,但是当列表变得很大时,这项任务将变得非常耗时。 (不能使用 .removeIf,因为它需要最低 api 级别 24,但我的应用程序的最低 api 是 22)
【问题讨论】:
【参考方案1】:为了能够移除项目,除了保留值之外,您还必须保留其键。
所以你为键创建了一个附加列表:
keys = new ArrayList<String>();
然后在onChildAdded
中,将快照的key添加到这个列表中:
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
posts.add(dataSnapshot.getValue(GalleryPostModel.class));
keys.add(dataSnapshot.getKey());
unapprovedAdapter.notifyDataSetChanged();
现在可以在onChildRemoved
中查找key,比查找post/value快很多:
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot)
int index = keys.indexOf(dataSnapshot.getKey());
posts.remove(index);
keys.remove(index);
unapprovedAdapter.notifyDataSetChanged();
【讨论】:
以上是关于从子列表中删除对象已删除的android的主要内容,如果未能解决你的问题,请参考以下文章
removeChild() 方法从子节点列表中删除某个节点。如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL。