Firebase 返回相同值的 3 倍

Firebase is returning 3 times the same value

在 Firebase 进行最后一次更新后,我遇到了一些问题。我目前最大的问题是我无法修复我在此更新之前完成的 class 应用程序。 下面的 class 在我的列表视图中返回了 3 次相同的名称,我有 3 个注册用户,所有 3 个都有不同的名称。

注意:它 returns 记录应用程序的用户名的 3 倍。

package com.example.stark.chattest;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListAdapter;
import android.widget.ListView;

import com.example.stark.chattest.model.Message;
import com.example.stark.chattest.model.User;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.ArrayList;

public class ChatActivity extends AppCompatActivity {

    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private FirebaseDatabase database = FirebaseDatabase.getInstance();
    private DatabaseReference myRef = database.getReference("users");
    private String TAG = "Resultado: ";
    private ArrayList<String> userName = new ArrayList<String>();
    private ListView usersListView = (ListView) findViewById(R.id.chatListView);
    private ListAdapter usersListViewAdapter = new ArrayAdapter<String>(ChatActivity.this, android.R.layout.simple_list_item_1, userName);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        mAuth = FirebaseAuth.getInstance();

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                } else {
                    Intent intent = new Intent(ChatActivity.this, SignActivity.class);
                    startActivity(intent);
                    finish();
                }
            }
        };

        ImageButton sendImageButton = (ImageButton) findViewById(R.id.sendImageButton);

        sendImageButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                EditText messageEditText = (EditText)findViewById(R.id.messageEditText);
                FirebaseUser firebaseUser = mAuth.getCurrentUser();
                Message message = new Message();
                message.setMessage(String.valueOf(messageEditText.getText()));
                message.setRead(true);
                message.setTime(22221);
                message.setSendersID(firebaseUser.getUid());
                message.setReceiversID("WTImZyGv5fcOJlGWI9fi0gdrfbd2");

                myRef.child(message.getSendersID()).child("message").child(message.getReceiversID()).child("4").setValue(message);

                //Set the Reciever Message
                message.setRead(false);
                myRef.child(message.getReceiversID()).child("message").child(message.getSendersID()).child("4").setValue(message);
            }
        });

        ChildEventListener childEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
                User user = dataSnapshot.getValue(User.class);
                userName.add(user.getName());
                usersListView.setAdapter(usersListViewAdapter);

            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };
        myRef.addChildEventListener(childEventListener);
    }
}

Here is my DB table.

注意:英语不是我的母语:p

@编辑 我删除了 onChildChanged 中的所有内容,并将所有代码放在 onChildAdded 中。

您应该更改代码中的一些内容,例如这一行

ListView usersListView = (ListView) findViewById(R.id.chatListView);
ListAdapter usersListViewAdapter = new ArrayAdapter<String>(ChatActivity.this, android.R.layout.simple_list_item_1, userName);

把这一行写在你的onCreate()方法里,你只需要初始化一次,

关于查询用户,您应该在 onChildAdded() 方法中执行此操作而不是 onChildChanged(),并且您不必使用 for 循环解析结果,它将自动添加

一些代码来解释我所说的,

@Override
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
    User user = dataSnapshot.getValue(User.class);
    userName.add(user.getName());
    usersListViewAdapter.notifyDataSetChanged();
}

您可以从 onChildChanged() 中删除代码,看看是否有帮助