Firebase返回相同值的3倍

时间:2016-06-01 10:32:51

标签: android firebase firebase-realtime-database

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

注意:它返回记录应用程序的用户名的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

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

1 个答案:

答案 0 :(得分:1)

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

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()中移除代码,看看是否有帮助