使用childeventlistener从recyclerview中的firebase删除数据

时间:2018-03-06 15:08:53

标签: android firebase

我正在尝试从firebase删除图像和一些数据,并从我的recyclerview中删除它们。

我已经成功完成了这项工作并且正在删除图像,但它并没有立即删除界面中的图像。

我必须离开活动并返回才能查看更新的视图。

这是我的ChildEventListener:

object(HTTP_Request2_Response)#5 (9) { 
["version":protected]=> string(3) "1.1" 
["code":protected]=> int(200) 
["reasonPhrase":protected]=> string(2) "OK" 
["effectiveUrl":protected]=> string(65) "https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize" 
["headers":protected]=> array(10) { 
["cache-control"]=> string(8) "no-cache" 
["pragma"]=> string(8) "no-cache" 
["content-length"]=> string(3) "274" 
["content-type"]=> string(31) "application/json; charset=utf-8" 
["expires"]=> string(2) "-1" 
["x-powered-by"]=> string(7) "ASP.NET" 
["apim-request-id"]=> string(36) "96fgh4z1-62z0-43r3-82z7-8823hdg5g86d" 
["strict-transport-security"]=> string(44) "max-age=31536000; includeSubDomains; preload" 
["x-content-type-options"]=> string(7) "nosniff" 
["date"]=> string(29) "Tue, 06 Mar 2018 14:55:20 GMT" } 
["cookies":protected]=> array(0) { } 
["lastHeader":protected]=> string(4) "date" 
["body":protected]=> string(274) "
[{"faceRectangle":{"height":264,"left":162,"top":523,"width":264},
"scores":{"anger":1.38974974E-06,"contempt":2.75673688E-08,"disgust":3.75520244E-06,"fear":5.69216375E-11,"happiness":0.999994636,"neutral":1.77765841E-07,"sadness":3.03275627E-09,"surprise":2.25669652E-08}}]" 
["bodyEncoded":protected]=> bool(true) 

按下删除后会发生什么:

 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) {

        }
    });

}

和onDestroy覆盖:

@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();
            }
        }
    });
}

}

更新了解决方案

我尝试了一个解决方案并且更接近我的目标。 现在当我删除视图中的一个项目,并在我的onChildRemoved中调用Toast时,我得到了祝酒词。这是代码:

   @Override
protected void onDestroy() {
    super.onDestroy();
    mDatabaseRef.removeEventListener(mDBListener);
}

所以基本上我没有删除旧的childeventlistener(因为它完美地工作,因为它应该适用于其他一切)

现在我把这个childEventlistener放在第一个下面,只是现在我正在听我想要删除的同一个孩子。

现在当我从视图中删除一个项目时,我得到Toast“Item deleted”。

问题在于我添加mAdapter.notifyDataSetChanged();

它仍然只显示吐司而没有其他事情发生......

2 个答案:

答案 0 :(得分:0)

我认为您需要覆盖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();
}

在对问题进行更新之后,接下来要做的就是更新适配器,通过o nChildRemove()检测从数据库中删除的内容,然后从中删除它适配器。从适配器中删除后,只需调用 notifyDataSetChanged()即可。

有关Firebase Listen for child events

的更多信息

答案 1 :(得分:0)

我没有设法在childEventListener方法中找到解决方案。所以我使用了valueEventListener来解决问题。