2016-08-16 3 views
0

Ich versuche, eine andere alternative Lösung zu finden, um zu überprüfen, ob der Benutzer auf dem Post bewertet hat.Bewertungsleiste Android Alternative Methode für OnRatingBarChangeListener?

Das Problem ist, dass wenn ich OnRatingBarChangeListener verwenden ein anderer Benutzer abstimmen und ändern Sie die Bewertung, die das Ereignis ausgelöst wird.

I OnClickListener und OnTouchListener ohne wirklichen Erfolg versucht haben, weil sie die ursprüngliche Methode überschreiben und interagieren nicht korrekt mit dem Rating bar ...

Irgendwelche Vorschläge?

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); 
        } 

       } 
      } 
     }); 
    } 
    } 
}); 

Antwort

0

Ich bin der Schöpfer der Bibliothek Sie verwenden: SimpleRatingBar.

Sie müssen den Wert boolean fromUser in der onRatingChanged Methode verwenden. Dies hat die gleiche Bedeutung, wie Sie aus der Lager android Bewertungsleiste erwarten:

  • Wahr, wenn die Bewertung aufgrund einer Aktion des Benutzers geändert wird (durch die Bewertungsbalken berühren)
  • False, wenn die Bewertung programmatisch geändert (durch den Aufruf setRating oder mit einer Animation)

in Ihrem Code So:

@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); 
        } 

       } 
      } 
     }); 
     } 
    } 
    } 

auch bedenken, dass ein bug es das war Ursache d Die Bibliothek gibt immer den Wert false im Wert fromUser zurück. Dies wird in der Version 0.1.1 korrigiert, die ich in ein paar Minuten veröffentlichen werde.

Sie können diese Version entweder von jcenter oder herunterladen. Fügen Sie einfach Ihre build.gradle Datei hinzu:

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

Vielen Dank! Du bist toll! –

Verwandte Themen