RatingBar:相同评级两次

时间:2013-09-10 10:29:42

标签: android 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");
   }


}

提前致谢

2 个答案:

答案 0 :(得分:5)

这是因为您有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;
            }
        });

答案 1 :(得分:1)

当评级栏发生变化时,你可以调用onRatingChanged()方法。当你点击两次相同的速率时,它可能不会改变速率条,所以onRatingChanged()里面的函数可以不被调用。另一种可能的方法是在之后调用oncreate 每个onRatingChanged()都被调用..但它不应该在评级栏中显示以前的费率。

更新:
假设你在onRatingChanged()内做的任何事情被包装成一个函数processing()。在这里,您最需要的是更改的评级。所以我们将它作为参数传递给函数。尝试以下方式

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

        @Override
        public void onClick(View v) {

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

        }
    });