Android 单个事件的事件侦听器多次调用相同的值

Android 单个事件的事件侦听器多次调用相同的值,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我正在使用一个节点的引用从Firebase Realtime数据库中的另一个节点获取数据。我正在做的是首先在chatlist节点中获取当前用户Uid下的用户大小,然后从users节点调用这些用户ID,并将其打印到我的recyclerview。我得到的错误是,即使我获得了正确的大小,但用户ID添加了多次 数据库结构 Logcat 2020-04-19 14:25:31.411 12076-12076/com.shivam.chatapp2 D/Tag2: Size for each loop

我正在使用一个节点的引用从Firebase Realtime数据库中的另一个节点获取数据。我正在做的是首先在chatlist节点中获取当前用户Uid下的用户大小,然后从users节点调用这些用户ID,并将其打印到我的recyclerview。我得到的错误是,即使我获得了正确的大小,但用户ID添加了多次

数据库结构

Logcat

2020-04-19 14:25:31.411 12076-12076/com.shivam.chatapp2 D/Tag2: Size for each  loop   1
2020-04-19 14:25:31.411 12076-12076/com.shivam.chatapp2 D/Tag2: Size for each  loop   2
2020-04-19 14:25:31.412 12076-12076/com.shivam.chatapp2 D/Tag2: User List Ids :  KRhmaWXCctMHbU1Z6NAWRGGw2ag2
2020-04-19 14:25:31.417 12076-12076/com.shivam.chatapp2 D/Tag2: User List Ids :  n9KF5J5wuzSj4npgO8p16b7cOIV2
2020-04-19 14:25:31.419 12076-12076/com.shivam.chatapp2 D/Tag2: User List Ids :  KRhmaWXCctMHbU1Z6NAWRGGw2ag2
2020-04-19 14:25:31.422 12076-12076/com.shivam.chatapp2 D/Tag2: User List Ids :  n9KF5J5wuzSj4npgO8p16b7cOIV2
2020-04-19 14:25:31.678 12076-12076/com.shivam.chatapp2 D/Tag2: Name called  Shivam
2020-04-19 14:25:31.683 12076-12076/com.shivam.chatapp2 D/Tag2: Name called  Shivam
2020-04-19 14:25:31.694 12076-12076/com.shivam.chatapp2 D/Tag2: Name called  Harshita
2020-04-19 14:25:31.695 12076-12076/com.shivam.chatapp2 D/Tag2: Name called  Harshita
代码

private void chatlist\u loop(){
mUsers.clear();
mUserAdapter=newuseradapter(getContext(),mUsers,false);
recyclerView.setAdapter(mUserAdapter);
mUserAdapter.notifyDataSetChanged();
串定影器;
fuser=FirebaseAuth.getInstance().getCurrentUser().getUid();
rootRef=FirebaseDatabase.getInstance().getReference();
ChatlistRef=rootRef.child(“Chatlist”).child(fuser);
mValueEventListener=新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot ds:DataSnapshot.getChildren()){
字符串userid=ds.getKey();
添加(userid);
Log.d(标记“每个循环的大小”+UserChatList.Size());
}
UserListSize=UserChatList.size();

对于(int i=1;i您正在为常规for循环的每次迭代创建一个for each循环,这就是为什么要添加多个值,请尝试以下操作:

...........
...........

mValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

//loop through every user id in the fuser node      
for (DataSnapshot ds : dataSnapshot.getChildren()) {

//grab the id
String userID = ds.getKey();

//start a new call to users to grab details
DatabaseReference UserRef= FirebaseDatabase.getInstance().getReference("Users").child(userID);


UserRef.addListenerForSingleValueEvent(new ValueEventListener() {

@Override
public void onDataChange(DataSnapshot dataSnapshot) {

//fill the list with the needed users  
User user = dataSnapshot.getValue(User.class); 
mUsers.add(user);
mUserAdapter.notifyDataSetChanged();


}

@Override
public void onCancelled(DatabaseError databaseError) {

Log.w(TAG, "loadPost:onCancelled", databaseError.toException());

}



});



}

//finish loop


}

@Override
public void onCancelled(DatabaseError databaseError) {

Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
}
};
ChatlistRef.addValueEventListener(mValueEventListener);

您的解决方案起作用了,只是想再问一件事,如果我想使用ValueEventListener实时更新,但不更新重复的数据,我可以做什么如果您不想添加重复的对象,请在添加对象之前执行if语句检查对象是否不在列表中,
if(!mUsers.contains(user)){//add user to mUsers}
我尝试过,但当其他用户重新启动活动时,它仍然会增加
...........
...........

mValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

//loop through every user id in the fuser node      
for (DataSnapshot ds : dataSnapshot.getChildren()) {

//grab the id
String userID = ds.getKey();

//start a new call to users to grab details
DatabaseReference UserRef= FirebaseDatabase.getInstance().getReference("Users").child(userID);


UserRef.addListenerForSingleValueEvent(new ValueEventListener() {

@Override
public void onDataChange(DataSnapshot dataSnapshot) {

//fill the list with the needed users  
User user = dataSnapshot.getValue(User.class); 
mUsers.add(user);
mUserAdapter.notifyDataSetChanged();


}

@Override
public void onCancelled(DatabaseError databaseError) {

Log.w(TAG, "loadPost:onCancelled", databaseError.toException());

}



});



}

//finish loop


}

@Override
public void onCancelled(DatabaseError databaseError) {

Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
}
};
ChatlistRef.addValueEventListener(mValueEventListener);