SetText () и setProgress () не обновляются в ViewPager

Мое приложение
использует ViewPager и Fragements. Каждый Fragment показывает ListView с CheckBoxes, ProgressBar и TextView. Если проверяются 3 из 6 CheckBoxes, ProgressBar и TextView должны обновиться до 3%.

Проблема
TextView и ProgressBar не отображают обновление должным образом. Я зарегистрировал рассчитанное значение прогресса и значение tv.getText() и pb.getProgress(). Есть две проблемы:

1.) Значение прогресса и значения tv.getText() и pb.getProgress() не равны. Значения, возвращаемые tv.getText() и pb.getProgress(): всегда на 3% больше или меньше. (И да, значения, которые я передаю в setProgress () и setText (), верны)

11-30 14:44:57.099 14230-14230/com.example..myapplication 
D/CheckBox: setProgressBar()
progress should be = 3%
progressBar is = 0%
progressText is = 0%

11-30 14:45:02.275 14230-14230/com.example..myapplication 
D/CheckBox: setProgressBar()
progress should be = 7%
progressBar is = 3%
progressText is = 3%

2.) TextView и ProgressBar View всегда показывают 0%.

Я пытался исправить это часами и даже не могу найти решение здесь, в StackOverflow. Что не так?

Класс фрагмента

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
    ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment, container, false);

    progressBar = view.findViewById(R.id.progressBar);
    progressText = view.findViewById(R.id.progressText);
    lv = view.findViewById(R.id.list_view_nahrungsmittel);
    dateTV = view.findViewById(R.id.changeDate);
    leftBTN = view.findViewById(R.id.changeDateBTNLeft);
    rightBTN = view.findViewById(R.id.changeDateBTNRight);
    backToTodayBTN = view.findViewById(R.id.backToTodayBTN);

    mDB = new DBHelper(getContext());  //hier oder main?
    items = MainActivity.getList();

    setBTN();
    setBackToTodayButton();
    setNumCheckedCB();
    setDateTV();
    setProgressBarFirstTime();
    setListAdapter();
    setListViewListener();
    setButtons();

    return view;
}

public void setProgressBar(int i) {
    Log.d("CheckBox", "setProgressBar()");
    progress = (int)(((float)i * 100f) / (float) MainActivity.getNumCB());
    Log.d("CheckBox", "progress should be = " + progress + "%" );
    Log.d("CheckBox", "progressBar is = " + progressBar.getProgress() + "%" );
    Log.d("CheckBox", "progressText is = " + progressText.getText() );
    progressBar.setProgress(progress);
    progressText.setText(progress + "%");
}

ListAdapter
устанавливает Listener для каждого CheckBox в ListView, который вызывает метод setProgressBar ().

//Click on CB
    final DataHolder finalHolder1 = holder;
    holder.cb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
         @Override
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
             if (buttonView.isPressed()) {
                 buttonView.setChecked(isChecked);

                 //Update Progress
                 int i = 0;
                 boolean[] stateCheckBox = mDB.getCheckBoxState(date, item.getTitle());
                 if (isChecked){
                     if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
                        if (stateCheckBox[1] == false && stateCheckBox[2] ==false) { i = 3; }
                        else if (stateCheckBox[1] == false && stateCheckBox[2] ==true) { i = 2; }
                        else if (stateCheckBox[1] == true && stateCheckBox[2] ==true) { i = 1; }
                     }
                     else if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE) {
                         if (stateCheckBox[1] == false) { i = 2; }
                         else if (stateCheckBox[1] == true) { i = 1; }
                     }
                     else { i = 1; }
                 }
                 else { i = 1; }
                 updateNumCheckedCheckBoxes(date, isChecked, i);

                 //Update CB state
                 //Case1: Three CB in row, Left gets checked -> set all other right CB´s checked
                 if (isChecked) {
                     finalHolder1.cb2.setChecked(isChecked);
                     finalHolder1.cb3.setChecked(isChecked);
                     mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, isChecked);
                 } else {
                     if (finalHolder1.cb2.getVisibility() == View.GONE) {
                         //Case2: Only one Cb in row, uncheck
                         mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, isChecked);
                     } else if (finalHolder1.cb3.getVisibility() == View.GONE) {
                         //Case3: Two Cb in row, left gets unchecked
                         mDB.updateCheckBoxState(date, item.getTitle(), isChecked, !isChecked, !isChecked);
                     } else {
                         //Case4: Three CB, left gets unchecked
                         mDB.updateCheckBoxState(date, item.getTitle(), isChecked, !isChecked, !isChecked);
                     }
                 }
             }
         }
     });

    holder.cb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (buttonView.isPressed()) {
                buttonView.setChecked(isChecked);

                //Update Progress
                int i = 0;
                boolean[] stateCheckBox = mDB.getCheckBoxState(date, item.getTitle());
                if (isChecked){
                    if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
                        if (stateCheckBox[2] ==false) { i = 2;}
                        else if (stateCheckBox[2] ==true) { i = 1;}
                    }
                    else if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE) { i = 1; }
                }
                else {
                    if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
                        if (stateCheckBox[0] ==false) { i = 1; }
                        else if (stateCheckBox[2] ==true) { i = 2; }
                    }
                    else if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE) {
                        if (stateCheckBox[0] == true) { i = 2; }
                        else if (stateCheckBox[0] == false) { i = 1;}
                    }
                }
                updateNumCheckedCheckBoxes(date, isChecked, i);

                //Update CB state
                //Case5: Second from the left CB gets checked -> set right CB checked
                if (isChecked) {
                    finalHolder1.cb3.setChecked(isChecked);
                    mDB.updateCheckBoxState(date, item.getTitle(), !isChecked, isChecked, isChecked);
                }
                //Case6: Second from the left CB gets unchecked -> set left CB unchecked
                else {
                    finalHolder1.cb1.setChecked(isChecked);
                    mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, !isChecked);
                }
            }
        }
    });

    holder.cb3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (buttonView.isPressed()) {
                buttonView.setChecked(isChecked);

                //Update Progress
                int i = 0;
                boolean[] stateCheckBox = mDB.getCheckBoxState(date, item.getTitle());
                if (isChecked){ i = 1; }
                else {
                    if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
                        if (stateCheckBox[0] == false && stateCheckBox[1] == false) { i = 1; }
                        else if (stateCheckBox[0] == false && stateCheckBox[1] ==true) { i = 2; }
                        else if (stateCheckBox[0] == true && stateCheckBox[1] == true) { i = 3; }
                    }
                }
                updateNumCheckedCheckBoxes(date, isChecked, i);

                //Update CB state
                //Case5: Right CB gets unchecked -> set all other left CB´s unchecked
                if (!isChecked) {
                    finalHolder1.cb2.setChecked(isChecked);
                    finalHolder1.cb1.setChecked(isChecked);
                    mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, isChecked);
                }
                else {
                    //Case 6: 3CBs, only right CB gets checked
                    mDB.updateCheckBoxState(date, item.getTitle(), !isChecked, !isChecked, isChecked);
                }
            }
        }
    });

    //Click on Image Button
    holder.imageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v){
            Intent intent = new Intent(context , Statistic2Activity.class);
            context.startActivity(intent);
        }
    });
}

private void updateNumCheckedCheckBoxes (String date, boolean isChecked, int i){
    mDB.updateNumCheckedCheckBoxes(date, isChecked, i);
    updateProgressBar(date);

}

Ваш слушатель не звонит setProgressBar().

TheWanderer 30.11.2018 15:13

оно делает. updateProgressBar () вызывает setProgressBar (). Я забыл добавить в образец кода updateProgressBar (). В противном случае сообщения журнала от setProgressBar () не будут отображаться.

Jan Meyer 30.11.2018 15:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавление этого в метод setProgressBar () устранило мою проблему:

progressBar = view.findViewById(R.id.progressBar);
progressText = view.findViewById(R.id.progressText);

Другие вопросы по теме