android checkbox android-listview listener expandablelistview

checkbox click android



Android setOnCheckedChangeListener vuelve a llamar cuando vuelve la vista anterior (8)

No puedo resolver un problema con el método getGroupView.

el problema es que el escucha setOnCheckedChangeListener se invoca muchas veces.

Digamos que marque un cierto elemento de casilla de verificación. Luego lo muevo fuera de la vista y luego me desplazo hacia atrás. Lo que pasa es que el oyente es llamado una vez más. Y el problema es que almaceno checkbox-id en un arraylist dentro de este oyente para usarlo más adelante en el código. La consecuencia es que cada vez que se llama al oyente y se distorsionan los datos, se agregan más elementos al arrailista.

¿Hay una solución para esto? ¿Qué tengo que hacer? ¿Debería, por ejemplo, anular el registro del oyente?

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


¿Qué versión de Android estás usando?

Parece ser un problema para múltiples componentes, especialmente con el método CheckChange () (CheckBox, RadioButton) y no puedo proporcionar una buena explicación de por qué está sucediendo.

¿Asumiría porque registra el cambio del estado de posición y se apodera del cambio de otras propiedades? Un problema similar fue abordado here

En cualquier caso, una solución alternativa a esto podría ser agregar un 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 } });


Agregue lo siguiente al diseño de ToggleButton :

android:saveEnabled="false"

Esto aseguraría que Android no almacene el estado de verificación en RestoreInstance y, a su vez, no causará el cambio de estado experimentado por usted.


Agregue una instrucción if adicional si se isShown() en el método OnCheckedChange y resuelve el problema al que se llama al OnCheckedChangeListener varias veces. No hay necesidad de cambiar a un onClickListener:

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


Enfrenté el mismo problema y luché durante varias horas para ver todas las discusiones relacionadas con esto. Intenté arreglar esto manteniendo viewHolder.checkBox.setTag(groupPosition);
esta declaración antes de viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() este oyente. Y el código funciona exactamente como se esperaba.



Me quedé atascado con el mismo problema y encontré una forma de evitarlo utilizando el detector de clics.

Primero, compruebe si la casilla de verificación tiene asignado onclicklistener o no. Si no, eso significa que el adaptador está configurando el valor para el primero.

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

Ahora despues de revisar esto

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

Esperemos que el tema del desplazamiento se vaya. Funciona bien aquí.


OnCheckedChangeListener trabajó para mí con una condición if

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


texto fuerte hay muchas maneras de resolver el problema

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

** y hay otra manera **

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