Android Cómo saber qué casilla de verificación está seleccionada

Estoy haciendo mi primera aplicación de Android y tengo un problema para el que no puedo encontrar la respuesta en cualquier parte de Google.

Quiero una lista de elementos con casillas de verificación. Quiero tanto el elemento en sí y la casilla de verificación para ser clicable.

public class MyItem extends ListActivity { private ArrayList<MyItem> items; public void onCreate(Bundle savedInstanceState) { /* code which creates instances of MyItem and inserts them on the *list* variable */ MyArrayAdapter adapter = new MyArrayAdapter(this, R.layout.my_item, list); setListAdapater(adapter); setContentView(R.layout.items_list); } public onListItemClick(ListView l, View v, int position, long id){ //handles the click on an item } public class MyArrayAdapter extends ArrayAdapter<MyItem>{ private MyItem item; public MyArrayAdapter(Context context, int resourceId, ArrayList<MyItem> list){ //code for the constructor } public getView(int position, View convertView, ViewGroup parent){ convertView = inflater.inflate(resourceId, null); this.item = list.get(position); if (this.item == null) { return convertView; } else{ if (resourceId == R.layout.my_item) { final CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkbox); if(cb != null){ //initially if(chosen) cb.setChecked(true); else cb.setChecked(false); //set listener cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { if(cb.isChecked()) chosen = true; else chosen = false; } }); } } return convertView; } } } 

No se preocupe por la variable elegida. Escribí eso simplemente al código. En realidad, corresponde a un valor en una base de datos. El clic en un elemento funciona bien. Sin embargo, cuando hago clic en una casilla de verificación lo que sucede es esto:

  • La casilla en la que he hecho clic aparece seleccionada (este es el trabajo de la interfaz de usuario de Android)
  • La casilla que internamente está marcada es la última de la pantalla, es decir, si mi pantalla muestra 8 ítems y hago clic en uno de ellos (no importa cuál) el cheque aparece en la casilla de verificación correcta pero internamente , El 8o artículo es el que consigue comprobado.

Agradecería cualquier ayuda que pudiera proporcionarme. Gracias por adelantado.

En realidad, el respaldo de implementación chosen es clave. Android hace una cierta optimización con vistas de la lista para permitir que usted reutilice las vistas del artículo de la lista para evitar la creación excesiva del objeto y la colección de la basura (que conduciría a menudo al movimiento espeluznante). Como tal, usted tiene que asegurarse de que siempre que sea pertinente, usted sabe exactamente qué elemento de la lista que está trabajando.

Digamos que usted tiene una lista de 100 elementos. Su pantalla probablemente no va a ser capaz de mostrar todos ellos. Sólo puede mostrar diez elementos a la vez. Por lo tanto, 10 vistas (realmente ver jerarquías) se crean para mostrar los elementos visibles. Cuando se desplaza hacia abajo hasta los siguientes diez elementos, en lugar de crear 10 vistas nuevas (para un total de 20), la lista sólo podría crear una más (para cubrir el caso en que la mitad de un elemento se muestra en la parte superior y la mitad de uno Se muestra en la parte inferior de la pantalla para un total de 11 elementos visibles en la pantalla) y el resto de elementos reutilizar las vistas creadas antes.

Así que una tabla conceptual que representa la primera pantalla podría tener este aspecto:

 Vista del artículo
 --------
 Artículo 1 Ver 1
 Artículo 2 Ver 2
 Artículo 3 Vista 3
 Artículo 4 Vista 4
 Artículo 5 Ver 5
 Artículo 6 Ver 6
 Artículo 7 Ver 7
 Tema 8 Ver 8
 Artículo 9 Vista 9
 Artículo 10 Ver 10

Y para después de desplazarse por diez elementos, podría parecer un poco como esto (probablemente no exactamente, pero esto te da la idea):

 Vista del artículo
 --------
 Punto 11 Ver 1
 Artículo 12 Ver 2
 Artículo 13 Ver 3
 Artículo 14 Ver 4
 Artículo 15 Ver 5
 Artículo 16 Vista 6
 Artículo 17 Ver 7
 Artículo 18 Ver 8
 Punto 19 Vista 9
 Artículo 20 Ver 10

Así que lo que se puede recoger de esto es que una sola vista dada puede representar diferentes elementos a medida que se desplaza alrededor. Esto significa que sus manejadores de eventos tienen que ser un poco más dinámicos en la forma en que encuentran el elemento al que están relacionados.

Todo esto es para darle un poco de fondo para que pueda cambiar la forma en que está implementando su método getView . Aquí está su problema real: el item variable está en el ámbito de su Adapter . Desafortunadamente, estoy adivinando que el código que no has publicado aquí que has reemplazado con chosen utiliza el item . Establece el item cada vez que se crea una vista de elemento. Esto significa que una vez creadas las primeras 8 vistas, el item se establece en el octavo elemento de la lista. Cada vez que haga clic en una casilla de verificación, está utilizando el item que es el octavo elemento y no el elemento que corresponde a la vista del elemento de lista en la que ha hecho clic.

Esta es la estructura para getView que recomiendo:

 public getView(int position, View convertView, ViewGroup parent){ View view = convertView; if (view == null) { view = inflater.inflate(R.layout.my_item, null); } final MyItem item = list.get(position); final CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkbox); // This stores a reference to the actual item in the checkbox cb.setTag(item); if(item.chosen) cb.setChecked(true); else cb.setChecked(false); //set listener cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // This gets the correct item to work with. final MyItem clickedItem = (MyItem) view.getTag(); if(cb.isChecked()) clickedItem.chosen = true; else clickedItem.chosen = false; } }); return view; } } 

Tenga en cuenta que me he librado de la variable de item nivel de clase.

Prueba esto

 public getView(int position, View convertView, ViewGroup parent){ View view = convertView; if (view == null) { view = inflater.inflate(R.layout.my_item, null); } final MyItem item = list.get(position); // This stores a reference to the actual item in the view view.setTag(item); final CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkbox); //set listener cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // This gets the correct item to work with. final MyItem clickedItem = (MyItem) view.getTag(); if(cb.isChecked()) clickedItem.chosen = true; else clickedItem.chosen = false; } }); cb.setChecked(item.chosen); return view; } 

Debe guardar el valor isChecked en su objeto MyItem y el conjunto explícito marcado en checkbox en el método getView de su adaptador. Utilice onCheckedChangedListener.

Si estoy siguiendo su explicación suena como usted tiene una lista y cada fila en la lista tiene un checkbox y un TextView. En mi aplicación tengo algo similar y en lugar de tratar de hacer que tanto la casilla de verificación y TextView haga clic y reaccionar a que yo uso ListView de onItemclick. Cuando usted coge el usuario presionado un artículo en la lista, entonces en el código usted puede comprobar o un-check la casilla de verificación. Da la impresión visual de que el usuario es capaz de marcar la casilla, pero es muy fácil de implementar.

  • NullPointerException cuando se utiliza CustomListAdapter
  • Android SimpleCursorAdapter no se actualiza cuando cambia la base de datos
  • cómo devolver datos de AsyncTask al hilo principal
  • ¿Cómo puedo crear DialogFragment de ListActivity en Android?
  • Androide. Excepción de SQLite: no existe ninguna columna _id
  • Cambiar el color de fondo de un elemento en Android ListActivity onListItemClick
  • Envoltura de texto mediante simple_list_item_multiple_choice
  • El elemento de lista (una vista) cambia de orden sin que suceda mientras se desplaza (rápido) en un ListView
  • Android: conectar mysql (XAMPP) a la aplicación android en el emulador
  • Desplazamiento por Android en la lista
  • Android: ¿Cómo tener un menú compartido en cada actividad (lista) sin volver a escribir los métodos anulados?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.