Android RatingBar (заполнение следующей звезды)

У меня есть следующий RatingBar:

<RatingBar
                android:id="@+id/ratingBar"
                android:layout_width="wrap_content"
                android:layout_height="35dp"
                android:numStars="5"
                android:max="5"
                android:stepSize="1.0"
                android:layout_marginTop="12dp"/>

Когда я нажимаю на левую часть звезды - она ​​выбирается, но когда я нажимаю на правую часть - выбирается следующая звезда. Мне нужна звезда, на которую я нажимаю, чтобы выбрать ту часть, на которую я щелкаю. Помогите мне пожалуйста понять что не так.

2 ответа

Это, возможно, неудачный побочный эффект RatingBar простирающийся ProgressBar, который внутренне использует int прогресс с округлением (а не ceil) идти от float искать позицию для int прогресс. Лучшее решение, которое я нашел, это установить ваш stepSize в 0.01 скорее тогда 1затем установите

rb.setOnRatingBarChangeListener( new RatingBar.OnRatingBarChangeListener() {
    @Override
    public void onRatingChanged( final RatingBar ratingBar, final float rating, final boolean fromUser ) {
        if ( fromUser ) {
            ratingBar.setRating( Math.ceil(rating) );
        }
    }
});

Я потратил много времени, пытаясь решить эту проблему в Xamarin.Droid. Библиотека, используемая в проекте, кажется немного другой. Если кто-то сталкивается с этой проблемой и еще не может ее решить, это решило проблему здесь:

Сначала я установил stepSize на 0,01 . Затем мне нужно было импортировать Android.Widget.RatingBar в класс Holder , унаследовать интерфейс IOnRatingBarChangeListener и реализовать метод OnRatingChanged как виртуальный . Внутри метода я сделал округление, а затем вызвал метод внутри события .

      using static Android.Widget.RatingBar;

namespace Holder
{
    public class Holder : RecyclerView.ViewHolder, IOnRatingBarChangeListener
    {
        public Question question;
        public TextView tvQuestion;
        public RatingBar rbRating;
        public Holder(Android.Views.View itemView, OnRatingChangeListener listener) : base(itemView)
        {
            tvQuestion = (TextView)itemView.FindViewById(Resource.Id.tvQuestion);
            rbRating = (RatingBar)itemView.FindViewById(Resource.Id.rbRating);
            rbRating.RatingBarChange += (o, e) =>
            {
                OnRatingChanged(rbRating, rbRating.Rating, true);
                listener.onRatingChange(question, rbRating.Rating);
            };
        }

        public virtual void OnRatingChanged(RatingBar ratingBar, float rating, bool fromUser)
        {
            if (fromUser)
            {
                var newRating = (Math.Ceiling(rating));
                ratingBar.Rating = (float)newRating;
            }
        }
    }
}
Другие вопросы по тегам