如何在不触发 OnRatingBarChangeListener 的情况下将 RatingBar 设置为具有固定星星的指标
How to set a RatingBar as indicator with fixed stars without triggering OnRatingBarChangeListener
我试图让用户对服务进行评分,我想阻止用户两次添加评分,问题是当用户已经对服务进行评分并且我从 firebase 检索星号时并将它们放在评级栏中,OnRatingBarChaneListener 被触发并再次为 firebase 增加价值。
这是我的代码,请帮助我。
final DatabaseReference r = database.getReference("rating");
r.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (final DataSnapshot snapshot5 : dataSnapshot.getChildren()){
final Rating rt = snapshot5.getValue(Rating.class);
final String ratingId= snapshot5.getKey();
// Toast.makeText(InfoService.this,key,Toast.LENGTH_SHORT).show();
assert rt != null;
if(!(rt.getId().equals(account.getUid())) && (rt.getIdservice().equals(key))) {
RatingB.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
String rateId = r.push().getKey();
// Toast.makeText(InfoService.this,"thank you for voting"+key,Toast.LENGTH_SHORT).show();
Rating rate = new Rating(rateId,account.getUid(),key,rating);
r.child(rateId).setValue(rate);
// int stars = Math.round(rating);
RatingB.setRating(rating);
RatingB.setIsIndicator(true);
}
});
}else {
textrate.setText("Votre evaluation");
RatingB.setIsIndicator(true);
RatingB.setRating(rt.getStar());
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
onRatingChanged
有一个参数boolean fromUser
,来自docs:
boolean: True if the rating change was initiated by a user's touch
gesture or arrow key/horizontal trackbell movement.
我认为您只需要在将新评级发送到 Firebase
之前检查此值是否为 True
我试图让用户对服务进行评分,我想阻止用户两次添加评分,问题是当用户已经对服务进行评分并且我从 firebase 检索星号时并将它们放在评级栏中,OnRatingBarChaneListener 被触发并再次为 firebase 增加价值。 这是我的代码,请帮助我。
final DatabaseReference r = database.getReference("rating");
r.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (final DataSnapshot snapshot5 : dataSnapshot.getChildren()){
final Rating rt = snapshot5.getValue(Rating.class);
final String ratingId= snapshot5.getKey();
// Toast.makeText(InfoService.this,key,Toast.LENGTH_SHORT).show();
assert rt != null;
if(!(rt.getId().equals(account.getUid())) && (rt.getIdservice().equals(key))) {
RatingB.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
String rateId = r.push().getKey();
// Toast.makeText(InfoService.this,"thank you for voting"+key,Toast.LENGTH_SHORT).show();
Rating rate = new Rating(rateId,account.getUid(),key,rating);
r.child(rateId).setValue(rate);
// int stars = Math.round(rating);
RatingB.setRating(rating);
RatingB.setIsIndicator(true);
}
});
}else {
textrate.setText("Votre evaluation");
RatingB.setIsIndicator(true);
RatingB.setRating(rt.getStar());
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
onRatingChanged
有一个参数boolean fromUser
,来自docs:
boolean: True if the rating change was initiated by a user's touch gesture or arrow key/horizontal trackbell movement.
我认为您只需要在将新评级发送到 Firebase
True