评级栏 Android OnRatingBarChangeListener 的替代方法?
Rating bar Android alternative method for OnRatingBarChangeListener?
我正在尝试寻找另一种替代解决方案来检查用户是否对 post 进行了评分。
问题是,如果我使用 OnRatingBarChangeListener,另一个用户可能会投票并更改将触发事件的评分。
我尝试了 onClickListener 和 OnTouchListener 但没有真正成功,因为它们覆盖了初始方法并且无法与评级栏正确交互...
有什么建议吗?
if (ratingSimplePost.getDidRate() == true) {
ratingViewHolder.starRating.setRating((float)ratingSimplePost.getAverageRating());
ratingViewHolder.starRating.isIndicator();
}else if(ratingSimplePost.getDidRate() == false){
ratingSimplePost.setDidRate(true);
ratingViewHolder.starRating.setOnRatingBarChangeListener(new SimpleRatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(SimpleRatingBar simpleRatingBar, float rating, boolean fromUser) {
if (ratingViewHolder.starRating.getRating() == 0) {
} else {
ratingViewHolder.starRating.setRating(ratingViewHolder.starRating.getRating());
double avgSum = ratingSimplePost.getAverageRating() * ratingSimplePost.getParticipantCount();
double myRating = ratingViewHolder.starRating.getRating();
myRating = (Math.round(myRating * 100));
myRating = myRating / 100;
double newRating = (avgSum + myRating) / (ratingSimplePost.getParticipantCount() + 1);
newRating = (Math.round(newRating * 100));
newRating = newRating / 100;
ParseQuery<ParseObject> updateRating = ParseQuery.getQuery("Posts");
updateRating.whereEqualTo("objectId", ratingSimplePost.getPostId());
final double finalNewRating = newRating;
final double finalMyRating = myRating;
ratingSimplePost.setAverageRating(newRating);
updateRating.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> objects, ParseException e) {
if (e == null) {
for (int i = 0; i < objects.size(); i++) {
ParseObject object = objects.get(i);
object.put("AvgRating", finalNewRating);
ArrayList<Double> ratingValues = (ArrayList<Double>) object.get("Ratings");
ratingValues.add((double) finalMyRating);
object.put("Ratings", ratingValues);
ratingSimplePost.setNewRating(finalNewRating);
ArrayList<String> partList = (ArrayList<String>) object.get("Participants");
partList.add(ParseUser.getCurrentUser().getUsername());
object.put("Participants", partList);
object.saveInBackground();
ratingViewHolder.starRating.setRating((float) finalNewRating);
}
}
}
});
}
}
});
我是您正在使用的库的创建者:SimpleRatingBar。
您需要在onRatingChanged
方法中使用boolean fromUser
的值。这与您对股票的预期含义相同 android RatingBar:
- 如果评级因用户操作(通过触摸评级栏)而改变,则为真
- 如果评级以编程方式更改(通过调用 setRating 或使用动画),则为 False
因此,在您的代码中:
@Override
public void onRatingChanged(SimpleRatingBar simpleRatingBar, float rating, boolean fromUser) {
if (fromUser) {
// user changed the rating by touching the rating bar
double avgSum = ratingSimplePost.getAverageRating() * ratingSimplePost.getParticipantCount();
double myRating = simpleRatingBar.getRating();
myRating = (Math.round(myRating * 100));
myRating = myRating / 100;
double newRating = (avgSum + myRating) / (ratingSimplePost.getParticipantCount() + 1);
newRating = (Math.round(newRating * 100));
newRating = newRating / 100;
ParseQuery<ParseObject> updateRating = ParseQuery.getQuery("Posts");
updateRating.whereEqualTo("objectId", ratingSimplePost.getPostId());
final double finalNewRating = newRating;
final double finalMyRating = myRating;
ratingSimplePost.setAverageRating(newRating);
updateRating.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> objects, ParseException e) {
if (e == null) {
for (int i = 0; i < objects.size(); i++) {
ParseObject object = objects.get(i);
object.put("AvgRating", finalNewRating);
ArrayList<Double> ratingValues = (ArrayList<Double>) object.get("Ratings");
ratingValues.add((double) finalMyRating);
object.put("Ratings", ratingValues);
ratingSimplePost.setNewRating(finalNewRating);
ArrayList<String> partList = (ArrayList<String>) object.get("Participants");
partList.add(ParseUser.getCurrentUser().getUsername());
object.put("Participants", partList);
object.saveInBackground();
ratingViewHolder.starRating.setRating((float) finalNewRating);
}
}
}
});
}
}
}
此外,请记住有一个 bug 导致库在 fromUser
的值中总是 return false。
这将在版本 0.1.1
中得到纠正,我将在几分钟后发布。
您可以从 jcenter
或 Maven Central
下载此版本。只需添加到您的 build.gradle
文件:
dependencies {
compile 'com.iarcuschin:simpleratingbar:0.1.+'
}
我正在尝试寻找另一种替代解决方案来检查用户是否对 post 进行了评分。
问题是,如果我使用 OnRatingBarChangeListener,另一个用户可能会投票并更改将触发事件的评分。
我尝试了 onClickListener 和 OnTouchListener 但没有真正成功,因为它们覆盖了初始方法并且无法与评级栏正确交互...
有什么建议吗?
if (ratingSimplePost.getDidRate() == true) {
ratingViewHolder.starRating.setRating((float)ratingSimplePost.getAverageRating());
ratingViewHolder.starRating.isIndicator();
}else if(ratingSimplePost.getDidRate() == false){
ratingSimplePost.setDidRate(true);
ratingViewHolder.starRating.setOnRatingBarChangeListener(new SimpleRatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(SimpleRatingBar simpleRatingBar, float rating, boolean fromUser) {
if (ratingViewHolder.starRating.getRating() == 0) {
} else {
ratingViewHolder.starRating.setRating(ratingViewHolder.starRating.getRating());
double avgSum = ratingSimplePost.getAverageRating() * ratingSimplePost.getParticipantCount();
double myRating = ratingViewHolder.starRating.getRating();
myRating = (Math.round(myRating * 100));
myRating = myRating / 100;
double newRating = (avgSum + myRating) / (ratingSimplePost.getParticipantCount() + 1);
newRating = (Math.round(newRating * 100));
newRating = newRating / 100;
ParseQuery<ParseObject> updateRating = ParseQuery.getQuery("Posts");
updateRating.whereEqualTo("objectId", ratingSimplePost.getPostId());
final double finalNewRating = newRating;
final double finalMyRating = myRating;
ratingSimplePost.setAverageRating(newRating);
updateRating.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> objects, ParseException e) {
if (e == null) {
for (int i = 0; i < objects.size(); i++) {
ParseObject object = objects.get(i);
object.put("AvgRating", finalNewRating);
ArrayList<Double> ratingValues = (ArrayList<Double>) object.get("Ratings");
ratingValues.add((double) finalMyRating);
object.put("Ratings", ratingValues);
ratingSimplePost.setNewRating(finalNewRating);
ArrayList<String> partList = (ArrayList<String>) object.get("Participants");
partList.add(ParseUser.getCurrentUser().getUsername());
object.put("Participants", partList);
object.saveInBackground();
ratingViewHolder.starRating.setRating((float) finalNewRating);
}
}
}
});
}
}
});
我是您正在使用的库的创建者:SimpleRatingBar。
您需要在onRatingChanged
方法中使用boolean fromUser
的值。这与您对股票的预期含义相同 android RatingBar:
- 如果评级因用户操作(通过触摸评级栏)而改变,则为真
- 如果评级以编程方式更改(通过调用 setRating 或使用动画),则为 False
因此,在您的代码中:
@Override
public void onRatingChanged(SimpleRatingBar simpleRatingBar, float rating, boolean fromUser) {
if (fromUser) {
// user changed the rating by touching the rating bar
double avgSum = ratingSimplePost.getAverageRating() * ratingSimplePost.getParticipantCount();
double myRating = simpleRatingBar.getRating();
myRating = (Math.round(myRating * 100));
myRating = myRating / 100;
double newRating = (avgSum + myRating) / (ratingSimplePost.getParticipantCount() + 1);
newRating = (Math.round(newRating * 100));
newRating = newRating / 100;
ParseQuery<ParseObject> updateRating = ParseQuery.getQuery("Posts");
updateRating.whereEqualTo("objectId", ratingSimplePost.getPostId());
final double finalNewRating = newRating;
final double finalMyRating = myRating;
ratingSimplePost.setAverageRating(newRating);
updateRating.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> objects, ParseException e) {
if (e == null) {
for (int i = 0; i < objects.size(); i++) {
ParseObject object = objects.get(i);
object.put("AvgRating", finalNewRating);
ArrayList<Double> ratingValues = (ArrayList<Double>) object.get("Ratings");
ratingValues.add((double) finalMyRating);
object.put("Ratings", ratingValues);
ratingSimplePost.setNewRating(finalNewRating);
ArrayList<String> partList = (ArrayList<String>) object.get("Participants");
partList.add(ParseUser.getCurrentUser().getUsername());
object.put("Participants", partList);
object.saveInBackground();
ratingViewHolder.starRating.setRating((float) finalNewRating);
}
}
}
});
}
}
}
此外,请记住有一个 bug 导致库在 fromUser
的值中总是 return false。
这将在版本 0.1.1
中得到纠正,我将在几分钟后发布。
您可以从 jcenter
或 Maven Central
下载此版本。只需添加到您的 build.gradle
文件:
dependencies {
compile 'com.iarcuschin:simpleratingbar:0.1.+'
}