ArrayList.Remove no funciona la primera vez que se invoca
Tengo un ArrayList<String>
que uso para almacenar PackageInfo (un ejemplo de un elemento en el arraylist es "com.skype.raider").
El arralista se inicializa de la siguiente manera:
- Android Color de progreso de Seekbar en tiempo de ejecución
- Unity Android Error de compilación WIN32 Excepción ZipAlign
- Problemas de conexión HttpsURLConnection
- Java.lang.ClassCastException: [Ljava.lang.Object; No se puede emitir a com.sakhnin.classes.MonthlySummary
- Esperando que el Cajón de Navegación se cierre antes de inicializar Fragmentos con el lazo vacío while
private List<String> pkgs;
Y en la clase Consturctor
pkgs = new ArrayList<>();
Cuando invoco pkgs.remove(String)
, no funciona, pero cuando repetidamente intento y quitar, eventualmente funciona.
Heres cómo probar si la eliminación trabajó (edité el código para que se lee más fácilmente)
private void togglePackage(String selectedPackage,CheckBox chk_app){ String m_pkg = selectedPackage.toString(); //redundant .toString() boolean checked = !chk_app.isChecked(); //checkbox boolean toggle if (checked && !pkgs.contains(m_pkg)) { //if not already in arraylist pkgs.add(m_pkg); //adding the newly checked package } else if (!checked && pkgs.contains(m_pkg)) { //if it needs to be removed pkgs.remove(m_pkg); //<-----------------------This works around the 3rd time i press the checkbox } //Here i check if the string was actually removed from the arrylist //This following code will not be in production, i just used it for testing if (pkgs.contains(m_pkg)) { if (checked) { chk_app.setChecked(checked);//Success } else { chk_app.setChecked(!checked);//Failure } } else { if (!checked) { chk_app.setChecked(checked);//Success } else { chk_app.setChecked(!checked);//Failure } } }
Aquí está el evento onclick no editado
RelativeLayout rl_container = (RelativeLayout) child.findViewById(R.id.rl_container); rl_container.setTag(pkg); rl_container.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String m_pkg = v.getTag().toString(); System.out.println("Pkg = "+m_pkg); boolean checked = !chk_app.isChecked(); if (checked && !pkgs.contains(m_pkg)) { pkgs.add(m_pkg); System.out.println("Adding " + m_pkg); } else if (!checked && pkgs.contains(m_pkg)) { pkgs.remove(m_pkg); System.out.println("Removing " + m_pkg); } if (pkgs.contains(m_pkg)) { if (checked) { System.out.println("Success"); chk_app.setChecked(checked); } else { System.out.println("Fail"); chk_app.setChecked(!checked); } } else { if (!checked) { System.out.println("Success"); chk_app.setChecked(checked); } else { System.out.println("Fail"); chk_app.setChecked(!checked); } } } });
Como ejemplo he incluido los contenidos de arraylists que conseguí iterando sobre la lista. Así como la salida de registro de mis pruebas
Listar contenido:
com.sbg.mobile.phone com.google.android.youtube com.e8tracks com.vlingo.midas com.google.android.googlequicksearchbox com.truecaller
Logcat sale del código no editado cuando intento anular la selección de "com.sbg.mobile.phone"
12-18 10:37:25 ViewPostImeInputStage ACTION_DOWN 12-18 10:37:25 Pkg = com.sbg.mobile.phone 12-18 10:37:25 Removing com.sbg.mobile.phone 12-18 10:37:25 Fail 12-18 10:37:28 ViewPostImeInputStage ACTION_DOWN 12-18 10:37:28 Pkg = com.sbg.mobile.phone 12-18 10:37:28 Removing com.sbg.mobile.phone 12-18 10:37:28 Fail 12-18 10:37:30 ViewPostImeInputStage ACTION_DOWN 12-18 10:37:31 Pkg = com.sbg.mobile.phone 12-18 10:37:31 Removing com.sbg.mobile.phone 12-18 10:37:31 Fail 12-18 10:37:32 ViewPostImeInputStage ACTION_DOWN 12-18 10:37:32 Pkg = com.sbg.mobile.phone 12-18 10:37:32 Removing com.sbg.mobile.phone 12-18 10:37:32 Fail 12-18 10:37:33 ViewPostImeInputStage ACTION_DOWN 12-18 10:37:33 Pkg = com.sbg.mobile.phone 12-18 10:37:33 Removing com.sbg.mobile.phone 12-18 10:37:33 Success
PD. Esta es mi primera pregunta, así que sé amable. También agradecería cualquier consejo en cómo mejorar en hacer preguntas, intenté incluir toda la información requerida, pero si usted necesita cualquier otra cosa, déjeme por favor saber.
- ¿Cómo puedo hacer una barra de progreso personalizada en la barra de acción?
- Importar org.apache.commons en aplicaciones android
- Android: error que incluye / reempaque las dependencias que hacen referencia a las clases principales de javax
- Reconocimiento de voz Java como androides
- Instanciar con una clase Pool <T> a través de la interfaz PoolObjectFactory
- Cómo arreglar "matriz tipo esperado encontrado java.util.arraylist"?
- Android Almacenamiento interno VS Preferencias compartidas
- ¿Cómo establecer el valor predeterminado en 0 en edittext cuando no se ingresa nada?
Creo que podría ser un problema, porque ArrayList
le da la oportunidad de almacenar objetos iguales varias veces. Tal vez, es una buena idea usar HashSet<String>
lugar?
private Set<String> pkgs;
Consideremos el comportamiento predeterminado de ArrayList:
ArrayList de cadenas tienen 5 elementos. Si elimina el elemento en la 2ª posición, entonces el arraylist se convertirá en 4 elementos y el 3er elemento ahora en la 2ª posición. Ahora cuando se quita el quinto elemento, pero su posición se cambia ahora.
Por lo tanto, utilice Arraylist de hashmap y cuando desee eliminar elementos de arraylist, debe iterar todos los elementos de arraylist y eliminar un elemento particular de la misma.
O si desea sólo elementos marcados cuando algún evento (como presionar un botón) occers entonces obtener sólo que los elementos seleccionados de adaptador de la lista.
El problema está en su condición. La condición debe ser como:
if (checked) { if (!pkgs.contains(m_pkg)) { pkgs.add(m_pkg); } } else { if (pkgs.contains(m_pkg)) { pkgs.remove(m_pkg); } }
Puede consultar los enlaces:
Agregar / quitar cadenas en un ArrayList <String> por casilla de verificación
Cómo manejar la casilla de verificación ischecked and unchecked event en android
- ¿Cómo enviar notificaciones a usuarios específicos con FCM?
- Error de sintaxis en token variabledeclaratorid esperado después de este token