it-swarm.com.de

Android setOnCheckedChangeListener ruft erneut auf, wenn die alte Ansicht wieder angezeigt wird

Ich kann ein Problem mit der getGroupView-Methode nicht lösen. 

das Problem ist, dass der Listener setOnCheckedChangeListener mehrmals aufgerufen wird. 

Angenommen, ich überprüfe ein bestimmtes Kontrollkästchen. Dann scrolle ich es außer Sicht und scrolle dann zurück. Was passiert, ist, dass der Hörer erneut aufgerufen wird. Und das Problem ist, dass ich Kontrollkästchen-IDs in einer Arrayliste innerhalb dieses Listeners speichere, um sie später im Code zu verwenden. Die Folge ist, dass der Arrayliste bei jedem Aufruf des Listeners mehr Elemente hinzugefügt werden und die Daten verzerrt werden. 

Gibt es dafür eine Lösung? was soll ich machen? Soll ich beispielsweise den Listener abmelden?

@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;
 }
22

Welche Android-Version verwendest du? 

Es scheint ein Problem für mehrere Komponenten zu sein, insbesondere mit einer checkedChange () - Methode (CheckBox, RadioButton), und ich kann keine gute Erklärung dafür geben, warum dies geschieht.

Ich würde davon ausgehen, dass es die Änderung des Positionszustandes registriert und die Änderung anderer Eigenschaften ergreift. Ein ähnliches Problem wurde angesprochen hier

In jedem Fall könnte eine Problemumgehung darin bestehen, eine OnClickListener() hinzuzufügen. 

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

      }
    });
47
Alexey

OnCheckedChangeListener hat für mich mit einer if-Bedingung gearbeitet

if(buttonView.isShown())
{
    //ToDo code
}
14
Sonal Bausakar

Fügen Sie Folgendes zu ToggleButton layout hinzu:

Android:saveEnabled="false"

Dies würde sicherstellen, dass Android den Überprüfungsstatus nicht in RestoreInstance speichert und nicht zu einer Änderung des Status führt.

6

Setzen Sie den Listener auf null, bevor Sie die Funktion setCheck () aufrufen, und enable, nachdem Sie Folgendes aufgerufen haben:

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

Referenz: Checkbox-Wert ändern, ohne onCheckChanged auszulösen

5
Mahmoud Ibrahim

Fügen Sie in der OnCheckedChange-Methode eine zusätzliche if-Anweisung isShown() hinzu. Dadurch wird das Problem gelöst, dass der OnCheckedChangeListener mehrmals aufgerufen wird.

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

Ich war mit dem gleichen Problem konfrontiert und hatte mehrere Stunden lang Schwierigkeiten, alle damit zusammenhängenden Diskussionen zu sehen. Ich habe versucht, das zu beheben, indem ich viewHolder.checkBox.setTag(groupPosition); behielt.
diese Anweisung vor viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() diesem Listener. Und der Code funktioniert genau wie erwartet.

1
anoop

starker Text Es gibt viele Möglichkeiten, das Problem zu lösen 

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**
                        }


        }
    });

** und es gibt einen anderen Weg **

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

Ich blieb bei dem gleichen Problem und fand einen Ausweg, indem ich den Click-Listener verwendete

Prüfen Sie zunächst, ob dem Kontrollkästchen der Onclicklistener zugewiesen ist oder nicht. Wenn nicht, bedeutet dies, dass der Adapter den Wert für den ersten Wert einstellt.

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

        }

Jetzt nach dem Überprüfen 

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();
                }
            });

Hoffentlich geht das Scrolling-Problem weg. Funktioniert hier gut.

0
farhan678