如何从 firebase 读取并显示在评级栏中
How to read from firebase and display in rating bar
我有一个评级栏,它应该根据登录的用户显示单个用户的平均评级。用户可以通过写入评级节点下的数据库来对另一个用户进行评级,如此处所示
被评分的用户在节点"ratee"下。请注意“-LxW7A......”是随机生成的密钥。
要在用户被多次评分的情况下查看用户的评分,我使用下面的代码获取评分总和并将其除以用户被评分的总次数以获得平均值
FirebaseUser user=mAuth.getCurrentUser();
String userId=user.getUid();
DatabaseReference refund =
FirebaseDatabase.getInstance().getReference("ratings");
Query query=refund.orderByChild("ratee").equalTo(userID);
final RatingBar ratingBar=(RatingBar)findViewById(R.id.ratingBar) ;
query.addValueEventListener(new ValueEventListener() {
int count=0;
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String rating=dataSnapshot.child("rater").getValue(String.class);
if (rating==null){Toast.makeText(getApplicationContext(),"empty ",Toast.LENGTH_SHORT).show();}else{
count=count+Integer.valueOf(rating);
double a = dataSnapshot.child("kutaPoints").getValue(double.class);
totalpointsused =+ a;
double tots=(double)count;
double result=totalpointsused/tots;
float abc=(float)result;
Toast.makeText(getApplicationContext(),""+abc,Toast.LENGTH_SHORT).show();
ratingBar.setRating(abc);
}}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
但是上面的代码不起作用,评分栏中没有显示任何内容,显示的是空的 toast。
当您使用以下查询时:
Query query=refund.orderByChild("ratee").equalTo(userID);
这意味着您在 onDataChange()
方法中作为参数获取的 DataSnapshot
对象包含一个结果列表。即使只有一个结果,正如我在您的屏幕截图中看到的那样,该列表也将包含一个元素。所以在谈论列表时,要获取我们需要遍历列表的元素。所以请检查以下代码行:
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long count = 0;
for(DataSnapshot ds : dataSnapshot.getChildren()) {
long ratingg = ds.child("ratingg").getValue(Long.class);
count = count + ratingg;
}
long avarage = count / dataSnapshot.getChildrenCount();
Log.d("TAG", "avarage: " + avarage);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
query.addListenerForSingleValueEvent(valueEventListener);
假设所有 4 个用户都将 ratingg
属性 的值设置为 4
,您的 logcat 中的结果将是:
avarage: 4
我有一个评级栏,它应该根据登录的用户显示单个用户的平均评级。用户可以通过写入评级节点下的数据库来对另一个用户进行评级,如此处所示
被评分的用户在节点"ratee"下。请注意“-LxW7A......”是随机生成的密钥。 要在用户被多次评分的情况下查看用户的评分,我使用下面的代码获取评分总和并将其除以用户被评分的总次数以获得平均值
FirebaseUser user=mAuth.getCurrentUser();
String userId=user.getUid();
DatabaseReference refund =
FirebaseDatabase.getInstance().getReference("ratings");
Query query=refund.orderByChild("ratee").equalTo(userID);
final RatingBar ratingBar=(RatingBar)findViewById(R.id.ratingBar) ;
query.addValueEventListener(new ValueEventListener() {
int count=0;
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String rating=dataSnapshot.child("rater").getValue(String.class);
if (rating==null){Toast.makeText(getApplicationContext(),"empty ",Toast.LENGTH_SHORT).show();}else{
count=count+Integer.valueOf(rating);
double a = dataSnapshot.child("kutaPoints").getValue(double.class);
totalpointsused =+ a;
double tots=(double)count;
double result=totalpointsused/tots;
float abc=(float)result;
Toast.makeText(getApplicationContext(),""+abc,Toast.LENGTH_SHORT).show();
ratingBar.setRating(abc);
}}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
但是上面的代码不起作用,评分栏中没有显示任何内容,显示的是空的 toast。
当您使用以下查询时:
Query query=refund.orderByChild("ratee").equalTo(userID);
这意味着您在 onDataChange()
方法中作为参数获取的 DataSnapshot
对象包含一个结果列表。即使只有一个结果,正如我在您的屏幕截图中看到的那样,该列表也将包含一个元素。所以在谈论列表时,要获取我们需要遍历列表的元素。所以请检查以下代码行:
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long count = 0;
for(DataSnapshot ds : dataSnapshot.getChildren()) {
long ratingg = ds.child("ratingg").getValue(Long.class);
count = count + ratingg;
}
long avarage = count / dataSnapshot.getChildrenCount();
Log.d("TAG", "avarage: " + avarage);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
query.addListenerForSingleValueEvent(valueEventListener);
假设所有 4 个用户都将 ratingg
属性 的值设置为 4
,您的 logcat 中的结果将是:
avarage: 4