Не могу решить "локальная переменная должна быть окончательной" - PullRequest
0 голосов
/ 03 октября 2018

Привет, я пытаюсь добавить расчеты из моей базы данных в зависимости от запроса пользователя, но мой float не будет работать, пока он не будет завершен, как я могу обойти это?

Код:

float v = (float) 0;
    StringBuilder upcoming = new StringBuilder("Upcoming\n\n");
    StringBuilder Results = new StringBuilder("Upcoming\n\n");
    switchExam.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(!isChecked)
            {
                for(FAssessment a : assessmentList) {
                    if(!a.getType().equals("Final"))
                    {
                        double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                        v += (float) d;
                    }                        
                }
            }
            else
            {
                for(FAssessment a : assessmentList) {
                    double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                    v += (float) d;
                }
            }
        }
    });

Здесь я получаю сообщение об ошибке v += (float) d;

Переменная 'v' доступна из внутреннего класса, она должна быть окончательной или эффективно окончательной

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Насколько я понимаю, вы хотите использовать эту переменную v снова позже.Если это так, вы можете взять необходимый код и поместить его в метод.Таким образом, вы можете объявить переменную в listener, что даст ей final, которую она ищет.

Вот так:

switchExam.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            StringBuilder upcoming = new StringBuilder("Upcoming\n\n");
            StringBuilder Results = new StringBuilder("Results\n\n");
            float v= 0;
            if(!isChecked)
            {

                for(FAssessment a : assessmentList) {
                    if(!a.getType().equals("Final"))
                    {
                        double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                        v += (float) d;
                    }

                    upcoming.append(a.getDesc()+" "+a.getDate()+"\n");
                    Results.append(a.getDesc()+" "+format.format(((a.getAchieved()/a.getTotal())*100))+"%\n");
                }                    
                SetInit(v,upcoming,Results);
            }
            else
            {
                for(FAssessment a : assessmentList) {
                    double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                    v += (float) d;
                    upcoming.append(a.getDesc()+" "+a.getDate()+"\n");
                    Results.append(a.getDesc()+" "+format.format(((a.getAchieved()/a.getTotal())*100))+"%\n");
                }
                SetInit(v,upcoming,Results);

            }
        }
    });
    switchExam.setChecked(true);

Затем в вашем методе вывставит то, что вы хотите сделать с вашей переменной v:

private void SetInit(float v, StringBuilder coming, StringBuilder results) {
    txtUpcoming.setText(coming);
    txtResults.setText(results);
    //And whatever you want to do with `v`
 }

Надеюсь, это поможет.:)

0 голосов
/ 03 октября 2018

Может быть, поменять, кто что хранит?

StringBuilder upcoming = new StringBuilder("Upcoming\n\n");
StringBuilder Results = new StringBuilder("Upcoming\n\n");

CompoundButton.OnCheckedChangeListener lister = new CompoundButton.OnCheckedChangeListener() {

    float v = 0.0;
    public float getV() { return v; }

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(!isChecked)
        {
            for(FAssessment a : assessmentList) {
                if(!a.getType().equals("Final"))
                {
                    double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                    v += (float) d;
                }                        
            }
        }
        else
        {
            for(FAssessment a : assessmentList) {
                double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                v += (float) d;
            }
        }
    }
};
switchExam.setOnCheckedChangeListener(lister);

тогда, когда окружающая программа должна знать, что v она может вызвать

lister.getV();

Примечание: вместо приведения 0 в число с плавающей точкойВы также можете сказать что-то вроде:

float v = 0f;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...