Android 为什么我在尝试删除某些内容时不断从Firebase获取重复数据?

Android 为什么我在尝试删除某些内容时不断从Firebase获取重复数据?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,为什么每次我试图从firebase中删除某些内容时都会不断获取重复数据?在我的onStart方法中,我成功地接收到了用户的信息,并且我试图删除一个特定的点击项,但每当我这样做时,我总是得到重复的数据。为什么会这样 //looped through Contact node access receiver UID and searched user ref for necessary information.. @Override public void onStart() {

为什么每次我试图从firebase中删除某些内容时都会不断获取重复数据?在我的onStart方法中,我成功地接收到了用户的信息,并且我试图删除一个特定的点击项,但每当我这样做时,我总是得到重复的数据。为什么会这样

 //looped through Contact node access receiver UID and searched user ref for necessary information..
    @Override
    public void onStart() {
        super.onStart();

        contactsRef.child(currentFirebaseUser.getUid()).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                    usersFriendsKey = dsp.getKey();
                    Log.i("friendsKey", usersFriendsKey);

                    usersRef.child(usersFriendsKey).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            userData = dataSnapshot.getValue(UserData.class);
                            contactsArrayList.add(userData);
                            chatListAdapter.notifyDataSetChanged();
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            String error = databaseError.getMessage();
                            Toast.makeText(getActivity(), "Error occured", Toast.LENGTH_SHORT).show();

                        }
                    });
                }
            }
删除项目

//Creates popup and allows user to delete a post from recycle view...
    public void deletePostMenu(final View v, final int position) {
        PopupMenu popup = new PopupMenu(v.getContext(), v);
        popup.getMenuInflater().inflate(R.menu.delete_menu, popup.getMenu());
        selectedUserId = contactsArrayList.get(position).getUser();

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.deleteMenu:
                        contactsRef.child(currentFirebaseUser.getUid()).child(selectedUserId).removeValue();
                        return true;


                        default:
                        //default intent
                        return true;
                }
            }
        });
        popup.show();
    }

正如Imran所说,当您将
addValueEventListener
附加到引用时,它将打开一个套接字以继续侦听对该引用的更改

当您对该引用执行删除、更新或任何更改时,将触发触发器,您将从第一个代码段在该引用处添加新元素

您可以附加一个
addListenerForSingleValueEvent
,它只会触发一次

因此,删除某个节点后,它将不会触发正在侦听该节点的其他代码

@Override
    public void onStart() {
        super.onStart();

        contactsRef.child(currentFirebaseUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                    usersFriendsKey = dsp.getKey();
                    Log.i("friendsKey", usersFriendsKey);

                    usersRef.child(usersFriendsKey).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            userData = dataSnapshot.getValue(UserData.class);
                            contactsArrayList.add(userData);
                            chatListAdapter.notifyDataSetChanged();
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            String error = databaseError.getMessage();
                            Toast.makeText(getActivity(), "Error occured", Toast.LENGTH_SHORT).show();

                        }
                    });
                }
            }

在Firebase中,如果将侦听器附加到一个节点(父节点)并对其任何子节点进行更改,则无论更改类型如何,都会在父节点上获得数据更改更新。正因为如此,您在删除时收到了一个数据更改。@ImranMohammed听起来像是一个答案Imran:)