0 votos

 El caso es que tengo un listado de archivos con un checkbox vacío para cada uno. Quisiera que al dejar pulsado sobre un item aparezca la barra CAB y en la opción select all item, se marquen automáticamente todos los checkbox. Lo que veo por los foros y he probado no funciona. Es esto:

  case R.id.SeleccionarTodo:
                    //your code here

                    lista.setClickable(true);
                    lista.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

                    for ( int i=0; i < lista.getCount(); i++) {
                        lista.setItemChecked(i,true);

                    }


                    return true;

Si hago eso y luego compruebo el resultado con la opcion lista.isItemChecked(), me dice que, efectivamente, todos mis checkbox están checkeados, pero visualmente me siguen apareciendo vacios y además si pulso sobre ellos sí aparece el aspa, o sea, que en realidad el checkbox de la vista no estaba checkeado porque sino se me cerraría la app por el error.

El listado de archivos lo consigo de un arrayadapter customizado, lo que leí en foros que había que ponerlo CHOICE y así lo hice pasándoselo por  la lista, pero lo que pienso que hace es hacerlo en el row, no específicamente en el checkbox.

 sólo se me ocurre hacerlo en plan cutre, que sería llamar a un xml con todos los checkboxseleccionados al seleccionar la opción del CAB, y setear de nuevo el arrayadapter con la nueva vista, teniendo que inflar otra vez el nuevo xml, setear el anterior listview a null, etc, vamos una cutrada.

 

por en Android

1 Respuesta

0 votos
En el momento en que pulsas todos, tienes que refrescar el listado al completo y llamar a notifyDataSetChanged() para que se vean los cambios del listado.
por

Si eso era lo que quería hacer, refrescar la lista. Lo que pasa es que notifyDataSetChanged()

es en el arraydapter no en el listview como bien sabes, y como ya he seteado el listview no me deja acceder al arrayadapter.

Por mucho que intento hacer esto no funciona:

lista.getadapter().notifyDataSetChanged() ;

 

También he intentado esto y no funciona:

  case R.id.SeleccionarTodo:
 //your code here
lista.setClickable(true);
                    lista.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

for ( int i=0; i < lista.getCount(); i++) {
lista.setItemChecked(i,true);

if (lista.isItemChecked(i)){
                                Toast.makeText(getApplicationContext(),Integer.toString(i),Toast.LENGTH_SHORT).show();

                            }

                        }
 ArrayAdapter  myArrayAdapter2 = new myArrayAdapter2 (getApplicationContext(),myList);
 myArrayAdapter2.notifyDataSetChanged();
                    
lista.setAdapter(myArrayAdapter2);

return true;

 

La idea es que realices el notifyDataSetChanged() en el momento en que pulsen el botón de seleccionar todo. Puedes realizar un método dentro del Adapter para esto (un método que se encargue de refrescar el listado con el notifyDataSetChanged() )
Sí eso es lo que quiero hacer, el caso es que es difícil que se me ocurra cómo hacerlo y que funcione. De todsas formas mil gracias Ramón, te tomas muchas molestias con nosotros y la verdad no sé cómo agradecértelo.

Por cierto, que difícil es aprender programación por uno mismo. ¿ Por qué no habrá academias para esto, con el tirón que tiene? No me importaría hacerme un curso de pago si lo hubiese. Si lo tienes en mente cuenta conmigo.

Un abrazo.
De nada :) Cursos hay muchos. También te puedo asegurar que se puede aprender por uno mismo con algo más de tiempo que realizando un curso. Por otro lado hay muchos libros para aprender, uno gratuito que te ofrecemos nosotros en http://jarroba.com/libro-android-100-gratis/