Lista de Android con el problema de checkbox

¡Tengo un extraño problema! Intento crear una vista de lista con casillas de verificación. En mi otro hilo me dijeron que debería usar una matriz que realiza un seguimiento de las filas que están marcadas. Hice eso y funcionó bien, pero la lógica es incorrecta y me encuentro con otro problema ahora.

public View getView(final int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.row, null); } CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox); checkbox.setChecked(checked[position]); final LinearLayout rowLayout = (LinearLayout) v.findViewById(R.id.individualRow); checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) { rowLayout.setBackgroundColor(Color.GRAY); checked[position] = false; } else { rowLayout.setBackgroundColor(Color.DKGRAY); checked[position] = true; } } }); } 

Tener todas las casillas de verificación sin marcar inicialmente funciona bien, mantiene las que selecciono marcadas, incluso si me desplazo hacia abajo y hacia atrás de nuevo, pero la matriz comprobada no está configurada correctamente. ¡Básicamente, la prueba if debería ser al revés!

 if(isChecked) { rowLayout.setBackgroundColor(Color.GRAY); checked[position] = true; } else { rowLayout.setBackgroundColor(Color.DKGRAY); checked[position] = false; } 

El problema es con el scroll realmente porque cada vez que desplazo el método onCheckedChanged se llama y dado que recicla las filas, pasa en la posición de la nueva fila que no está seleccionada, pero dado que tiene el mismo índice que el seleccionado previamente. cambia su valor por ejemplo, si marqué la casilla con el índice 2 (configurarlo en verdadero) y luego me desplazo hacia abajo, una nueva fila se convierte en fila con el índice 2, se llama nuevamente al método y se desmarca la casilla (el campo en la matriz comprobada).

Lo necesito para “recordar” todas las casillas que están marcadas. En otras palabras, quiero que la matriz comprobada se inicialice correctamente. ¡Y también para recordar qué casillas están marcadas y no perderlas cada vez que me desplazo!

¿Qué estoy haciendo mal?

¿Podrías ayudarme?

Gracias de antemano – Mike

Esto fue complicado.

El problema es que estás llamando a setChecked , activando el viejo OnCheckedChangeListener .

La solución es bastante simple: llame a setOnCheckedChangeListener antes de llamar a setChecked . De esta forma, corta el enlace al viejo oyente desde la vista reciclada.

Marca esto para la selección única de Checkbox de Checkbox en Listview

 AdpList adapter=new AdpList(this,array,false); listview.setAdapter(adapter); 

Cuando selecciona cualquier artículo, entonces en el elemento CLickListener haga lo siguiente

 listview.setonItemClickListener(new OnItemClickListener) 

Aquí obtendrá la posición del elemento actual

 array.get(Position); 

Obtenga la vista de Casilla de verificación y Al hacer clic en Casilla de verificación, cree un método en Adaptador, Me gusta

 adapter.setList(true); adapter.notifyDataSetChanged(); 

Y en Adapter, compruebe el parámetro que he pasado en el método Setlist luego coloque la condición:

 if (isChecking==true) { checkbox1.setChecked(true); }else{ checkBox1.setChecked(false); }