I have tried thousands of times to get the values from each restaurant and then get the average from those ratings for each one. Here is my firebase where there are 3 users who have rated the restaurants: Firebase database Here is my Java code:
private void displayRating(){ mRatingBar.setVisibility(View.VISIBLE); mRatingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { final DatabaseReference mRatingDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("rating").child(currentUserId); mRatingDb.setValue(rating); final DatabaseReference averageRatingDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("Average");
mRatingDb.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
double total = 0.0;
double count = 0.0;
double rating = ds.child(currentUserId).getValue(double.class);
total = total + rating;
count = count + 1;
double average = total / count;
averageRatingDb.setValue(average);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
}
For a reason I feel that my for loop on onDataChange() is not working at all. I can't get any of the ratings so I can calculate the average rating.
How I am going to get the values from the users and then get the average for each restaurant separetly?
If someone can help please do, I'm so lost. Thank you.
You can try like this:
final DatabaseReference mRatingDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("rating").child(currentUserId);
final DatabaseReference mQueryDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("rating")
final DatabaseReference averageRatingDb = FirebaseDatabase.getInstance().getReference().child(namesList.get(pos)).child("Average");
double total = 0.0;
double count = 0.0;
mRatingDb.setValue(rating).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mQueryDb.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
double rating = ds.getValue(double.class);
total = total + rating;
count = count + 1;
double average = total / count;
averageRatingDb.setValue(average);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
}
});