entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Android - Controla valor de Checkbox en un grid

Hola.

Tengo un Grid relleno de Checkbox. Los checkbox se insertan dinamicamente. Agarrando el texto de una base de datos.
El problema es que no logro controlar que checkBox a dejado el usuario en true y cuales en false;

Código getView del adaptador:

    public View getView(int position, View convertView, ViewGroup parent) {
    //ViewHolder holder;        
    View grid;

    if (convertView == null) {   
    grid = new View(context);
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    grid = inflater.inflate(R.layout.buscar_instalaciones_actividad_activity_grid_check_item, null);               

    }  else {
        grid = (View) convertView;

    }        
    chb = (CheckBox) grid.findViewById(R.id.buscar_instalaciones_actividad_activity_grid_item_checkBLC);
    chb.setText(items.get(position));

Código XML

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/album_item"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<CheckBox android:id="@+id/buscar_instalaciones_actividad_activity_grid_item_checkBLC"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/baloncesto"
android:checked="false" />

</RelativeLayout>

Alguna ayuda?

1 Respuesta

2votos

white Puntos75880

Que tal si guardas un identificador para los checkbox en tu base de datos? podrías usar SharedPreferences tambien.

puedes hacer uso del metodo setOnCheckedChangeListener de la clase CheckBox para guardar el estado de los checkbox.

por ejemplo:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    if (convertView == null)
    {
        convertView = inflater.inflate(R.layout.grid_item, null);
    }

    CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
    checkbox.setText(data.get(position));
    checkbox.setChecked(isCheckboxChecked("grid-checkbox-" + position));

    checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton view, boolean isChecked)
        {
            GridAdapter.this.saveCheckboxState("grid-checkbox-" + position, isChecked);
        }
    });

    return convertView;
}

private boolean isCheckboxChecked(String checkboxID)
    {
        SharedPreferences sharedPreferences = context.getSharedPreferences(checkboxID, Context.MODE_PRIVATE);
        return sharedPreferences.getBoolean(checkboxID, false);
    }

    private void saveCheckboxState(String checkboxID, boolean checked)
    {
        SharedPreferences sharedPreferences = context.getSharedPreferences(checkboxID, Context.MODE_PRIVATE);
        sharedPreferences.edit().putBoolean(checkboxID, checked).commit();
    }

la idea es que tengas un identificador para cada checkbox, en este ejemplo use su posicion: "grid-checkbox-" + position, que puedas guardar su estado en una base de datos o por SharedPreferences y en el metodo getView definir el estado del checkbox con el metodo setChecked.

0voto

egoitz_gonzalez comentado

Lo que se me hace estraño (y no me gusta mucho) es la utilización de SharedPreferences para este caso. No hay posibilidad de añadir un identificador único a cada checkbox cada vez que se van creando dinamicamente y utilizar este identificador para ver su estado (True:false) ?

0voto

egoitz_gonzalez comentado

Para ello se me ha ocurrido utilizar el atributo Tag del Checkbox. Te parece buena idea?

0voto

white comentado

use SharedPreferences como ejemplo, de hecho puedes tambien almacenar el estado de los checkbox en tu base de datos (sqlite, mysql, etc), y si, con setTag y getTag debería funcionar bien.

saludos!

0voto

egoitz_gonzalez comentado

Solucionado con Tag. En el metodo getView se realiza el setTag a cada checkBox y para saber el estado de cada checkBox he utilizado el siguiente código en la activity.

    //Recoger las actividades checkeadas por el usuario
public ArrayList<String> getItemCheked(){
    ArrayList<String> checkResultArray = new ArrayList<String>();
    //Get Item Checked
    //Recorremos cada elemento del grid buscando su resultado
    int count = grid.getAdapter().getCount();
    for(int i = 0; i < count; i++){
        RelativeLayout itemLayout = (RelativeLayout)grid.getChildAt(i);
        CheckBox chb = (CheckBox) itemLayout.findViewById(R.id.buscar_instalaciones_actividad_activity_grid_item_chb);
        if(chb.isChecked()){
            String valor = (String) chb.getTag();
            checkResultArray.add(valor);
            Log.e("Checking", "BuscarInstalacionesActividadActivity: El boton pulsado es: "+valor );
        }
    }
    return checkResultArray;
}

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta