Подтвердить что ты не робот

Android setOnCheckedChangeListener снова звонит, когда возвращается старый вид

Я не могу решить проблему с методом getGroupView.

проблема заключается в том, что прослушиватель setOnCheckedChangeListener вызывается много раз.

Скажем, я проверяю определенный элемент-флажок. Затем я просматриваю его вне поля зрения и затем прокручиваю назад. Случилось так, что слушатель снова вызван. И проблема в том, что я храню checkbox-id в arraylist внутри этого слушателя, чтобы использовать его позже в коде. Следствием этого является то, что больше элементов добавляется в arraylist каждый раз, когда слушатель вызывается и искажает данные.

Есть ли решение? что мне делать? Должен ли я, например, отменить регистрацию слушателя?

@Override
 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
     View view = null;

     final int group_position = groupPosition;
     if (convertView == null) {
         LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         view = inflater.inflate(R.layout.activity_phrase, parent, false);
         final ViewHolder viewHolder = new ViewHolder();
         viewHolder.text = (TextView) view.findViewById(R.id.groupTitle);
         viewHolder.checkBox = (CheckBox) view.findViewById(R.id.check);
         viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub

                if (buttonView.isChecked()) {
                    checked.add((Integer) viewHolder.checkBox.getTag());
                }
                else {
                    checked.remove((Integer) viewHolder.checkBox.getTag());
                }

            }
        });

        view.setTag(viewHolder);
        viewHolder.checkBox.setTag(groupPosition);

     } else {
         view = convertView;
         ((ViewHolder)view.getTag()).checkBox.setTag(groupPosition);
     }

     ViewHolder holder = (ViewHolder) view.getTag();
     holder.text.setText(titles[groupPosition]);

     for (int i = 0; i < checked.size(); i++) {
         if (checked.get(i) == group_position) {
             holder.checkBox.setChecked(true);
         }
         else if (checked.get(i) != group_position) {
             holder.checkBox.setChecked(false);
         }
     }

     return view;
 }
4b9b3361

Ответ 1

Какую версию Android вы используете?

Кажется, проблема для нескольких компонентов, особенно с методом checkedChange() (CheckBox, RadioButton), и я не могу дать хорошее объяснение, почему это происходит.

Я бы предположил, потому что он регистрирует изменение состояния позиции и захватывает изменение других свойств? Аналогичная проблема была рассмотрена здесь

В любом случае обходной путь вокруг этого может заключаться в добавлении OnClickListener().

CheckBox yourCheckBox = (CheckBox) findViewById (R.id.yourId);

yourCheckBox.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
                //is chkIos checked?
        if (((CheckBox) v).isChecked()) {
                         //Case 1
        }
        else 
          //case 2

      }
    });

Ответ 2

OnCheckedChangeListener работал у меня с одним условием

if(buttonView.isShown())
{
    //ToDo code
}

Ответ 3

Добавьте ниже в Макет ToggleButton:

android:saveEnabled="false"

Это позволит убедиться, что android не сохраняет состояние проверки до RestoreInstance и, в свою очередь, не приведет к изменению состояния, которое вы испытали.

Ответ 4

Установите для прослушивателя значение null перед вызовом функции setCheck() и включить после этого, например:

checkBox.setOnCheckedChangeListener (null);
checkBox.setChecked(true);
checkBox.setOnCheckedChangeListener (this);

Ссылка: Изменить значение флажка без запуска onCheckChanged

Ответ 5

Я столкнулся с одной и той же проблемой и несколько часов боролся со всеми обсуждениями, связанными с этим. Я попытался исправить это, сохранив viewHolder.checkBox.setTag(groupPosition);
это утверждение перед viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() этим слушателем. И код работает точно так, как ожидалось.

Ответ 6

Добавить дополнительный оператор if isShown() в методе OnCheckedChange и решает проблему, вызванную вызовом OnCheckedChangeListener несколько раз. Не нужно менять на onClickListener:

@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
   if (buttonView.isShown()) { 
        if (buttonView.isChecked()) { 
             //Do something 
        } else { 
             //Do something 
        } 
    } 
}

Ответ 7

Я застрял в одной и той же проблеме и нашел способ, используя при прослушивании кликов

Сначала проверьте, установлен ли флажок, назначенный ему onclicklistener или нет. Если это не означает, что адаптер устанавливает значение для первого.

if(!holder.checkbox.hasOnClickListeners())
        {
            holder.checkbox.setChecked(data.get( position ).getSelected());

        }

Теперь после проверки этого

holder.checkbox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    data.get( position ).setSelected(holder.checkbox.isChecked());
                    holder.checkbox.setChecked(data.get( position ).getSelected());

                    Toast.makeText(getApplicationContext(),
                            data.get( position ).get_number()+" : "+position, Toast.LENGTH_LONG).show();
                }
            });

Надеюсь, проблема с прокруткой исчезнет. Здесь хорошо работает.

Ответ 8

сильный текст Существует много способов решить проблему

checkBoxSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
           // write here your code for example ...
              if(isChecked){
               // do somtheing when is checked
                   }else{
                       // do somthing when is removed the check**strong text**
                        }


        }
    });

** и существует другой способ **

    checkBoxSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(((CheckBox)v).isChecked()){
//do something
            }else{
//do something
}
        });