Как отобразить рейтинг в панели оценок от Firebase?

Как отобразить рейтинг в панели оценок на основе Firebase? Я успешно загрузил его рейтинг в Firebase.

В приведенном ниже коде показано, как я загрузил рейтинг на основе шкалы оценок в Firebase, которая работает успешно.

ratingRef.child("Rating").setValue(ratingstar);
ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
    @Override
    public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
        Toast.makeText(UploadReviewAndRating.this, "Stars: " + (int)rating, Toast.LENGTH_SHORT).show();
    }
});

Intent intent = new Intent(UploadReviewAndRating.this, ViewProfile.class);
startActivity(intent);

В приведенном ниже коде показано, как я отображаю полосу рейтинга, которая не работает. Когда я запускаю приложение, оно вылетает и отображает ошибку:

java.lang.NullPointerException: попытка вызвать виртуальный метод int java.lang.Integer.intValue () для ссылки на нулевой объект.

ratingRef.child("Ratings").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        int rating = dataSnapshot.getValue(int.class);
        ratingBar.setRating(rating);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

person Hakiim    schedule 09.10.2017    source источник
comment
У меня есть чек, но все еще не работает. Если возможно, вы можете показать пример отображения рейтинга на панели рейтинга на основе firebase? это было бы полезно   -  person Hakiim    schedule 09.10.2017
comment
Перед использованием убедитесь, что dataSnapshot в onDataChange не null. Также обратите внимание: вы использовали .child("Rating") для сохранения, а затем .child("Ratings") для загрузки, которые отличаются.   -  person Grimthorr    schedule 09.10.2017
comment
Можете ли вы отредактировать свой вопрос, включив JSON в ratingRef.child("Ratings") (в виде текста, без скриншотов). Вы можете получить это, щелкнув ссылку «Экспорт JSON» в консоли базы данных Firebase.   -  person Frank van Puffelen    schedule 09.10.2017
comment
спасибо попробую позже   -  person Hakiim    schedule 11.10.2017


Ответы (1)


Когда вызывается onRatingChanged(), вам нужно сохранить результат в базе данных, используя свой ratingRef.

ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
    @Override
    public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
        if (fromUser) ratingRef.child("Rating").setValue(rating);
    }
});

Затем прикрепите прослушиватель к тому же ratingRef дочернему элементу, чтобы загрузить рейтинг, одновременно проверяя, что возвращенный результат из базы данных (dataSnapshot) не равен null.

ratingRef.child("Rating").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot != null && dataSnapshot.getValue() != null) {
            float rating = Float.parseFloat(dataSnapshot.getValue().toString());
            ratingBar.setRating(rating);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) { }
});
person Grimthorr    schedule 09.10.2017
comment
спасибо за ответ, и я сожалею о позднем обновлении. Попробую позже. - person Hakiim; 11.10.2017
comment
он говорит, что не может разрешить метод valueOf (java.lang.Object), есть ли способ? - person Hakiim; 12.10.2017
comment
Извините, попробуйте вместо этого: int rating = dataSnapshot.getValue(Integer.class);. - person Grimthorr; 12.10.2017
comment
он решает ошибку, но ничего не отображает в строке рейтинга - person Hakiim; 12.10.2017
comment
Я также нашел это в stackoverflow: Float rating = Float.parseFloat (stringFromDatabase); mRateBar.setRating (рейтинг); textView.setText (Рейтинг: + stringFromDatabase); что означает строка из базы данных? - person Hakiim; 12.10.2017
comment
Я предполагаю, что это будет результат, который вы получите от слушателя базы данных, используя dataSnapshot.getValue(). - person Grimthorr; 12.10.2017
comment
вы можете подробнее рассказать? - person Hakiim; 12.10.2017
comment
Посмотрев на это еще немного, я вижу, что метод setRating() в RatingBar принимает только значение с плавающей запятой. См. Мой обновленный ответ, в котором значение рейтинга сохраняется в базе данных в виде числа с плавающей запятой, а затем используется Float.parseFloat() для его повторного чтения, что должно сработать. - person Grimthorr; 12.10.2017
comment
это все еще не работает. Однако спасибо за ваше время, и я очень ценю это. - person Hakiim; 12.10.2017
comment
Я рада помочь. Получаете ли вы еще какие-нибудь ошибки? - person Grimthorr; 12.10.2017
comment
ошибки нет. Приложения по-прежнему работали без сбоев и ошибок. Просто он не отображает рейтинг на панели рейтинга. - person Hakiim; 12.10.2017
comment
Я сам провел некоторое тестирование и могу заставить его работать надежно - пожалуйста, посмотрите мой полный пример кода на странице gist. github.com/anonymous/195c491013a447d27c42adf7c281199a. - person Grimthorr; 13.10.2017
comment
Вау! приятно наконец работать! Спасибо, чувак, и я очень ценю ваше время и помощь. +1 - person Hakiim; 14.10.2017
comment
Рад, что смог помочь! Пожалуйста, не стесняйтесь проголосовать за мой ответ. - person Grimthorr; 14.10.2017