我有一个类对象的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)
答案 0 :(得分:0)
要删除该项目,除了保留其值外,还必须保留其键。
因此,您将为密钥创建一个附加列表:
keys = new ArrayList<String>();
然后在onChildAdded
中,将快照的密钥添加到此列表中:
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
posts.add(dataSnapshot.getValue(GalleryPostModel.class));
keys.add(dataSnapshot.getKey());
unapprovedAdapter.notifyDataSetChanged();
}
现在您可以在onChildRemoved
中查找键,这比查找帖子/值要快得多:
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
int index = keys.indexOf(dataSnapshot.getKey());
posts.remove(index);
keys.remove(index);
unapprovedAdapter.notifyDataSetChanged();
}