2015-12-18 10 views
6

Ich habe eine ArrayList<String>, die ich zum Speichern von PackageInfo verwenden (ein Beispiel für ein Element in der Arraylist ist "com.skype.raider").ArrayList.Remove funktioniert nicht beim ersten Aufruf

Die arralist initialisiert wird, wie folgt:

private List<String> pkgs; 

und in der Consturctor

Klasse
pkgs = new ArrayList<>(); 

Wenn ich pkgs.remove(String) aufrufen, funktioniert es nicht, aber wenn ich versuche immer wieder und zu entfernen, es funktioniert schließlich.

Heres, wie ich testen, ob die Entfernung gearbeitet (i bearbeitet den Code, so dass es leichter liest)


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

Hier ist die ungeschnittene Onclick-Ereignis ist

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


        } 
       }); 

Als Beispiel ich habe die arraylists Inhalte, die ich bekommen habe, indem ich über die Liste iterierte. sowie die Log-Ausgabe meiner Tests

Liste Inhalt:

com.sbg.mobile.phone 

com.google.android.youtube 

com.e8tracks 

com.vlingo.midas 

com.google.android.googlequicksearchbox 

com.truecaller 

Logcat Ausgabe von ungeschnittenem Code, wenn ich versuche, "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 

abzuwählen PS. Das ist meine erste Frage, also sei sanft. Ich würde auch jeden Rat zu, wie man Fragen besser zu verbessern, ich habe versucht, alle erforderlichen Informationen, aber wenn Sie etwas anderes benötigen, lassen Sie es mich bitte wissen.

+0

sind Sie sicher, dass Ihre Arraylist enthält die angegebene Zeichenfolge die ersten Male Sie versuchen, es zu entfernen? –

+0

int position = pkgs .indexOf ("Text"); dann pkgs .remove (Position); – koutuk

+1

verstehe nicht, warum Sie "isChecked" verwenden, um zu überprüfen, ob der String noch im arry ist ... Sie sollten nur 'pkgs.contains (...)' verwenden und nichts anderes ist wirklich wichtig. – mithrop

Antwort

6

Ich denke, es könnte ein Problem sein, denn ArrayList gibt Ihnen die Möglichkeit, gleiche Objekte mehrfach zu speichern. Vielleicht ist es eine gute Idee, stattdessen HashSet<String> zu verwenden?

private Set<String> pkgs; 
+0

Vielen Dank für Ihre Antwort, Ill geben Sie es und gehen Sie zurück – Mushroomzier

+0

Vielen Dank @RexSplode, das war das Problem. – Mushroomzier

1

Lassen Sie uns Arraylist Standardverhalten berücksichtigen:

Arraylist von Saiten 5-Elemente haben. Wenn Sie das Element an der 2. Position entfernen, wird die Arraylist mit 4 Elementen und das 3. Element mit der 2. Position eingestellt. Jetzt, wenn Sie das fünfte Element entfernen, wird seine Position jetzt geändert.

Verwenden Sie also Arraylist von hashmap und wenn Sie Elemente aus Arraylist entfernen möchten, sollten Sie alle Elemente von Arraylist iterieren und bestimmte Elemente daraus entfernen.

ODER wenn Sie möchten, dass nur Elemente überprüft werden, wenn ein Ereignis (wie ein Tastendruck) auftritt, dann werden nur die überprüften Elemente vom Adapter der Liste abgerufen.

+0

Danke für Ihre Antwort @SK, ich habe darüber nachgedacht, aber es stellt sich heraus, es war ein anderes Problem, siehe die angenommene Antwort – Mushroomzier

1

Problem ist in Ihrem Zustand.Bedingung sollte wie:

if (checked) { 
     if (!pkgs.contains(m_pkg)) { 
      pkgs.add(m_pkg); 
     } 
    } else { 
     if (pkgs.contains(m_pkg)) { 
      pkgs.remove(m_pkg); 
     } 
    } 

Sie auf die Links verweisen:

Adding/Removing Strings in an ArrayList<String> by Checkbox

How to Handle the checkbox ischecked and unchecked event in android

+0

Vielen Dank für Ihre Antwort, logisch sind die beiden Bedingungen gleich, das Problem war nicht, dass die Bedingung fehlgeschlagen ist, Es war ein Problem mit dem Container, den ich verwendet habe, aber dein Zustand ist besser formatiert und ich habe meinen geändert, um deinen zu verwenden. – Mushroomzier

Verwandte Themen