Foros del Web » Programando para Internet » Android »

Problema Listview + checkbox

Estas en el tema de Problema Listview + checkbox en el foro de Android en Foros del Web. Saludos. Estoy intentando hacer un Listview con icono + textview + checkbox por cada elemento. Está operativo en general, pero no consigo "guardar" los checkbox ...
  #1 (permalink)  
Antiguo 20/09/2012, 06:10
 
Fecha de Ingreso: julio-2012
Mensajes: 2
Antigüedad: 8 años, 6 meses
Puntos: 0
Problema Listview + checkbox

Saludos.

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

	}
AdaptadorOpciones.java :

Código:
//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;
}
MainActivity.java :

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);*/
    
    }
}
  #2 (permalink)  
Antiguo 20/09/2012, 17:00
 
Fecha de Ingreso: julio-2012
Mensajes: 2
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Problema Listview + checkbox

Se supone que poniendo el siguiente código después de la declaración "VistaTag vistaTag;" en el AdapatadorOpciones.java, debería funcionar... y aún así, nada... me estoy desesperando ya.

Código:
  //Se captura el evento de cambio de estado de cada checkbox de la lista
        CheckBox.OnCheckedChangeListener CBChangeListener = new CheckBox.OnCheckedChangeListener() {
            //Obtenemos ol objeto correspondiente al checkbox pinchado y modificamos
            //el valor de su atributo marcado
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    
                datos[position].setCh(isChecked);                
            }                
        };
  #3 (permalink)  
Antiguo 23/09/2012, 11:19
 
Fecha de Ingreso: junio-2012
Mensajes: 29
Antigüedad: 8 años, 6 meses
Puntos: 4
Respuesta: Problema Listview + checkbox

Cita:
Iniciado por MappoTrell Ver Mensaje
Se supone que poniendo el siguiente código después de la declaración "VistaTag vistaTag;" en el AdapatadorOpciones.java, debería funcionar...
No creo que solo con declarar un listener vaya a funcionar.

http://developer.android.com/reference/android/widget/CompoundButton.html#setOnCheckedChangeListener(and roid.widget.CompoundButton.OnCheckedChangeListener )

Etiquetas: checkbox, listview, todo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:22.