Tuve el mismo tipo de problema con mi vista de cambio. Después de mucha búsqueda y lectura, descubro que este problema es el resultado de una especie de optimización de las vistas promovidas por Android. Intenta reutilizar los objetos de vistas. Entonces, básicamente, cuando haces clic en un interruptor o en una casilla de verificación, disparas la devolución de llamada de cambio en otra vista también. La optimización realmente funciona, pero si no prestas atención, o simplemente no conoces el comportamiento (como yo), suceden resultados bastante extraños.
De todos modos, creo que esta solución sencilla:
Lo más recomendable es volver a utilizar el convertView pasó en el método getView(). De esta forma, optimiza la cantidad de Ram utilizada por la lista. Así que guardo mis vistas en un ViewHolder y programé el evento onCheckedChanged. El truco es que, antes de establecerse si el interruptor está marcado o no (en su caso, marque la casilla de verificación) y defina el oyente CheckedChange, simplemente restableceré la devolución de llamada con nulo, esto asegura que el evento de otro interruptor no se active.
Aquí es el fragmento:
...
viewHolder.switchView.setOnCheckedChangeListener(null);
viewHolder.switchView.setChecked(myObject.getStatus() > 0);
...
viewHolder.switchView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
...
}
});
myObject es un objeto final que tiene los datos almacenados de cursor.
Independientemente de que el interruptor se verifique o no, debe llamar al método setChecked.
Espero que ayude a alguien!
OK, así que fui con la opción uno. Justo antes de devolver la Vista en getView, hago "checkBox.setChecked (false);". Ahora, sin embargo, cuando marqué una casilla de verificación, me desplazo hacia abajo y hacia arriba, ya no está marcada. Sé que el problema es con mi implementación, y no con su concepto. ¿Qué estoy haciendo mal? –
Cuando el usuario marca la casilla de verificación, debe almacenar que la casilla de verificación del elemento ha sido marcada, en algún lugar de su código. Por ejemplo, si tiene 40 elementos en su ListView, puede tener una matriz de booleanos para almacenar si se marca una casilla de verificación de i-th. Luego, en 'getView', haga checkBox.setChecked (booleanArray [position]). – yuku
Tal vez sea porque es muy tarde en la noche, pero no puedo entender cómo grabar la posición. En el método getView, puedo tener la posición, pero en OnClick, donde necesito almacenar la posición, ya no tengo acceso a ella. –