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;
}
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
}
});
OnCheckedChangeListener
hat für mich mit einer if-Bedingung gearbeitet
if(buttonView.isShown())
{
//ToDo code
}
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.
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
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
}
}
}
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.
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
}
});
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.