评级栏 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 中得到纠正,我将在几分钟后发布。

您可以从 jcenterMaven Central 下载此版本。只需添加到您的 build.gradle 文件:

dependencies {
    compile 'com.iarcuschin:simpleratingbar:0.1.+'
}