Estoy intentando hacer un Listview con icono + textview + checkbox por cada elemento. Está operativo en general, pero no consigo "guardar" los checkbox seleccionados una vez ejecutada la aplicación. Vamos, que el checkeo de los checkbox en ejecución no tiene repercusión en el Array que guarda los datos.
Dejo el código a ver si alguien puede echarme una mano. Gracias anticipadas.
Opción.java :
Código:
AdaptadorOpciones.java : public class Opcion { // Cada opción tiene un título, un icono y un boolean private String titulo; private int icono; private boolean ch; public Opcion(String titulo, int icono, boolean ch){ this.setTitulo(titulo); this.setIcono(icono); this.setCh(ch); } // Definimos los getters y setters de la clase public boolean getCh(){ return ch; } public void setCh(boolean ch){ this.ch = ch; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public int getIcono() { return icono; } public void setIcono(int icono) { this.icono = icono; } }
Código:
MainActivity.java ://Definimos el Adaptador que dibuja la opciones del listado de la ListActivity class AdaptadorOpciones extends ArrayAdapter<Opcion> { Activity contexto; private Opcion[] datos; // Contructor del adaptador usando el contexto de la aplicación actual AdaptadorOpciones(Activity contexto, Opcion[] datos) { // Llamamos al constructor de la clase superior super(contexto, R.layout.opcion, datos); // Guardamos estas variables de la aplicación principal para usarlas luego this.datos = datos; this.contexto = contexto; } // Método que dibuja la Vista de cada Opción // Se invoca cada vez que haya que mostrar un elemento de la lista. public View getView(int position, View convertView, ViewGroup parent) { // Vista que Android indica como reutilizable (memoria que reutilizamos) View item = convertView; // Esta variable se usa para almacenar un objeto dentro // de la Vista que dibuja la opción VistaTag vistaTag; // Si Android indica que no hay una Vista reutilizable para la opción, // la definimos, inflamos el diseño que se define en el fichero // opcion.xml y establecemos su contenido if(item == null) { // Usamos un Inflater para inflar el diseño // Ahora tenemos una Vista que se asocia al elemento LayoutInflater inflater = contexto.getLayoutInflater(); // Definimos en la vista de vuelta el tipo de diseño item = inflater.inflate(R.layout.opcion, null); /*item.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } });*/ // Definimos el objeto que vamos a almacenar en el nuevo elemento vistaTag = new VistaTag(); // Obtenemos los punteros a las etiquetas recién infladas y al icono vistaTag.titulo = (TextView)item.findViewById(R.id.LblTitulo); vistaTag.ch = (CheckBox)item.findViewById(R.id.chkItem); vistaTag.icono = (ImageView) item.findViewById(R.id.icono); // Guardamos el objeto en el elemento item.setTag(vistaTag); } else { // Si estamos reutilizando una Vista, recuperamos el objeto interno vistaTag = (VistaTag)item.getTag(); } // Cargamos los datos de las opciones de la matriz de datos vistaTag.titulo.setText(datos[position].getTitulo()); vistaTag.ch.setChecked(datos[position].getCh()); vistaTag.icono.setImageResource(datos[position].getIcono()); // Devolvemos la Vista (nueva o reutilizada) que dibuja la opción return(item); } } // end class AdaptadorOpciones //Clase que se usa para almacenar las 2 etiquetas de tipo TextView y un icono de tipo ImageView de una opción class VistaTag { TextView titulo; CheckBox ch; ImageView icono; }
Código:
public class MainActivity extends ListActivity { // Usamos esta matriz para guardar los datos de las 32 opciones del listado private Opcion[] datos = new Opcion[7]; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Definimos 9 Opciones del listado en la matriz datos[0] = new Opcion("Atletismo", R.drawable.atletismo, false); datos[1] = new Opcion("Baloncesto", R.drawable.baloncesto, false); datos[2] = new Opcion("Fútbol", R.drawable.futbol, false); datos[3] = new Opcion("Golf", R.drawable.golf, false); datos[4] = new Opcion("Motociclismo", R.drawable.motociclismo, true); datos[5] = new Opcion("Natación", R.drawable.natacion, false); datos[6] = new Opcion("Ping Pong", R.drawable.pingpong, false); // Creamos el Adaptador que se usa para mostrar las opciones del listado ArrayAdapter<Opcion> adaptador = new AdaptadorOpciones(this, datos); // Asignamos el adaptador al ListActivity para que sepa cómo dibujar el listado de opciones setListAdapter(adaptador); //Definimos el Click del Botón. final Button btnboton1 = (Button)findViewById(R.id.button1); btnboton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { for (int i=0; i<=6; i++){ if (datos[i].getCh()){ Toast.makeText(getBaseContext(), "Has hecho clic en la '"+ datos[i].getTitulo()+"'", Toast.LENGTH_SHORT).show(); } } } }); } // end onCreate // Definimos el evento onClick de una opción del listado public void onListItemClick(ListView parent, View view, int position, long id) { if (parent.isItemChecked(position)) datos[position].setCh(true); else datos[position].setCh(false); // Usamos el parámetro "position" para saber la posición de la opción sobre la que el usuario ha hecho clic //Toast.makeText(getBaseContext(), "Has hecho clic en la '"+ datos[position].getTitulo()+"'", Toast.LENGTH_SHORT).show(); /* CheckBox cb = (CheckBox) view.findViewById(R.id.chkItem); if(cb.isChecked()) cb.setChecked(false); else cb.setChecked(true);*/ } }