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:

  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.

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

  • Abrir una página web en una aplicación para Android
  • Función onFocusChanged de Android nunca llamada
  • Calcular el consumo de energía del sensor Android
  • Cómo crear vinculación de datos personalizados en android? (Estudio del androide)
  • ¿Alternativas para DOM API en Android?
  • Cómo comprobar si existe una clave en Json Object y obtener su valor
  • java.lang.SecurityException: intentando leer gservices sin permiso
  • Comparación de MVC de Java con patrón de diseño Android
  • Cómo definir el fondo dibujable mediante programación en Android
  • Android obtiene PID de otras aplicaciones
  • Uso de Jsoup en los datos de inicio de sesión de POST
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.