RatingBar: один и тот же рейтинг дважды

Моя проблема в том, что когда я снова оцениваю одно и то же значение, оно не отвечает во второй раз. Это означает, что когда я оцениваю «4» в первый раз, я не могу оценить «4» во второй раз. ..Он отвечает только тогда, когда я оцениваю другое значение, а не «4».

Вот что я пробовал (мне нужно действие для getRatingBar в моем коде).

public class InteractiveRatingBarActivity extends Activity implements
       OnRatingBarChangeListener {
   RatingBar getRatingBar;
   RatingBar setRatingBar;
   TextView countText;
   int count;
   float curRate;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       findViewsById();

       setRatingBar.setRating(curRate);//overall rating
       getRatingBar.setOnRatingBarChangeListener(this);// ratingbar for user action. 

   }   

   private void findViewsById() {
       getRatingBar = (RatingBar) findViewById(R.id.getRating);
       setRatingBar = (RatingBar) findViewById(R.id.setRating);
       countText = (TextView) findViewById(R.id.countText);
   }


   public void onRatingChanged(RatingBar rateBar, float rating,
           boolean fromUser) {
       DecimalFormat decimalFormat = new DecimalFormat("#.#");
       curRate = Float.valueOf(decimalFormat.format((curRate * count + rating)
               / ++count));
       Toast.makeText(InteractiveRatingBarActivity.this,
               "New Rating: " + curRate, Toast.LENGTH_SHORT).show();
       setRatingBar.setRating(curRate);
       countText.setText(count + " Ratings");
   }


}

заранее спасибо


person Noufal    schedule 10.09.2013    source источник


Ответы (2)


Вы не можете вызывать метод onRatingChanged(), когда когда-либо происходит изменение в рейтинговой панели. То есть, когда вы дважды щелкаете по одной и той же ставке, она может не изменить рейт-бар, поэтому функции внутри onRatingChanged() не могут быть вызваны. Другим возможным способом является вызов oncreate после каждого вызова onRatingChanged(). Но он не должен отображать предыдущую ставку в строке рейтинга.

Обновление:
Предположим, что все, что вы делаете внутри onRatingChanged(), заключено в функцию processing(). Здесь, скорее всего, вам нужен измененный рейтинг. поэтому мы передаем его как параметр функции. Попробуйте следующий способ

            float newRating;
    myRatingBar.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

        newRating=myRatingBar.getRating();
        processing(newRating);   

        }
    });
person Ansar    schedule 11.09.2013
comment
Это был не мой ответ? - person Dyna; 11.09.2013
comment
Да, я не говорил, что ваш ответ неверен. Вы можете использовать методы touchListener и ratingbarChanged. - person Ansar; 11.09.2013

Это происходит потому, что у вас есть OnRatingChange (если он остается прежним, ваш рейтинг не меняется, поэтому этот метод не вызывается).

Вы можете разработать OnTouchListen:

ratingBar.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    float touchPositionX = event.getX();
                    float width = ratingBar.getWidth();
                    float starsf = (touchPositionX / width) * 5.0f;
                    int stars = (int) starsf + 1;

                    DecimalFormat decimalFormat = new DecimalFormat("#.#");
                    curRate = Float.valueOf(decimalFormat.format((curRate
                            * count + starsf)
                            / ++count));
                    Toast.makeText(InteractiveRatingBarActivity.this,
                            "New Rating: " + curRate, Toast.LENGTH_SHORT)
                            .show();
                    setRatingBar.setRating(curRate);
                    countText.setText(count + " Ratings");
                    v.setPressed(false);
                }
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    v.setPressed(true);
                }

                if (event.getAction() == MotionEvent.ACTION_CANCEL) {
                    v.setPressed(false);
                }

                return true;
            }
        });
person Dyna    schedule 10.09.2013