我试图从firebase中删除图像和一些数据,并从我的recyclerview中删除它们。
我已经成功地完成了这个并且它正在删除图像,但它不会立即删除界面中的图像。
我必须离开活动并返回以查看更新的视图。
这是我的ChildEventListener:
mDBListener = mDatabaseRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
mUploads.clear();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
Upload upload = postSnapshot.getValue(Upload.class);
upload.setKey(postSnapshot.getKey());
mUploads.add(upload);
}
mAdapter.notifyDataSetChanged();
mProgressCircle.setVisibility(View.INVISIBLE);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
mAdapter.notifyDataSetChanged();
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
当我按下删除时会发生什么:
@Override
public void onDeleteClick(int position) {
final Upload selectedITem = mUploads.get(position);
final String selectedKey = selectedITem.getKey();
Log.d(TAG, "SelectedKEY" + selectedKey);
StorageReference imageref = mStorage.getReferenceFromUrl(selectedITem.getImageUrl());
imageref.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if(user != null) {
Intent intent = getIntent();
Bundle bd = intent.getExtras();
String selectedId = (String) bd.get("selectedId");
mDatabaseRef.child(selectedId).child(selectedKey).removeValue();
Toast.makeText(ImagesActivity.this, "Item deleted ", Toast.LENGTH_SHORT).show();
}
}
});
}
和onDestroy覆盖:
@Override
protected void onDestroy() {
super.onDestroy();
mDatabaseRef.removeEventListener(mDBListener);
}
}
更新了解决方案
我尝试了一个解决方案,并且更接近我的目标。现在当我删除视图中的一个项目,并在我的onChildRemoved中调用Toast时,我得到了祝酒词。这是代码:
DatabaseReference mDatabaseRefff = FirebaseDatabase.getInstance().getReference(Uid).child(selectedId).child(selectedId).child(key);
dbEvent = mDatabaseRefff.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Toast.makeText(ImagesActivity.this, "Item deleted ", Toast.LENGTH_SHORT).show();
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
所以基本上我没有删除旧的childeventlistener(因为它完美的工作,因为它应该适用于其他一切)
现在我把这个childEventlistener放在第一个下面,只是现在我正在听我想要删除的同一个孩子。
现在当我从视图中删除一个项目时,我得到Toast“Item deleted”。
问题是当我添加mAdapter.notifyDataSetChanged();
它仍然只显示吐司,没有其他事情发生......
我相信你需要覆盖onChildRemoved,从适配器中删除项目并调用notifyDataSetChanged()来刷新recyclerView。
onChildRemoved()侦听从列表中删除的项目。传递给事件回调的DataSnapshot包含已删除子项的数据。
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
//add logic to remove item from adapter
String key = dataSnapshot.getKey();
//mAdapter.remove(index);
mAdapter.notifyDataSetChanged();
}
在对问题进行更新之后,接下来要做的就是更新适配器,通过onChildRemove()检测从数据库中删除的内容,并从适配器中删除它。从适配器中删除后,只需调用notifyDataSetChanged()即可。
我没有设法在childEventListener方法中找到解决方案。所以我使用了valueEventListener来解决问题。