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);
}
}
注意:英语不是我的母语: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()
中删除代码,看看是否有帮助
在 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);
}
}
注意:英语不是我的母语: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()
中删除代码,看看是否有帮助