Reputation: 159
I am using reference of one node to get data from another node in Firebase Realtime Database.What i am doing is first getting the size of users under current user Uid in chatlist node then calling those userids from users node and printing them on to my recyclerview.What error i am getting is even though i get the size correct but userids add multiple times.
Database Structure
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
Code
private void chatlist_loop(){
mUsers.clear();
mUserAdapter = new UserAdapter(getContext(), mUsers, false);
recyclerView.setAdapter(mUserAdapter);
mUserAdapter.notifyDataSetChanged();
String fuser;
fuser = FirebaseAuth.getInstance().getCurrentUser().getUid();
rootRef = FirebaseDatabase.getInstance().getReference();
ChatlistRef = rootRef.child("Chatlist").child(fuser);
mValueEventListener=new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String userIDS = ds.getKey();
UserChatList.add(userIDS);
Log.d(TAG,"Size for each loop "+UserChatList.size());
}
UserListSize=UserChatList.size();
for (int i =1;i<=UserListSize;i++) {
for (String usereReference:UserChatList) {
Log.d(TAG,"User List Ids : " +usereReference);
DatabaseReference UserRef= FirebaseDatabase.getInstance().getReference("Users").child(usereReference);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
mUsers.add(user);
mUserAdapter.notifyDataSetChanged();
String name = dataSnapshot.child("First").getValue(String.class);
Log.d(TAG, "Name called "+name);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
UserRef.addListenerForSingleValueEvent(eventListener);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
ChatlistRef.addListenerForSingleValueEvent(mValueEventListener);
Upvotes: 0
Views: 164
Reputation: 4035
You are making a for each loop for every iteration of the regular for loop, this is why you get multiple values added, try this:
...........
...........
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);
Upvotes: 1