Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ArrayList.Remove does not work the first time invoked

I Have an ArrayList<String> that I use to store PackageInfo(an example of an element in the arraylist is "com.skype.raider").

The arralist is initialized as follows:

    private List<String> pkgs;

And In The Class Consturctor

    pkgs = new ArrayList<>();

When i invoke pkgs.remove(String), it doesn't work, but when i repeatedly try and remove, it eventually works.

Heres how i test if removal worked( i edited the code so it reads more easily)


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

Here is the unedited onclick event

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


                    }
                });

As an example i have included the arraylists contents that i got by iterating over the list. as well as the log output of my tests

List contents:

com.sbg.mobile.phone

com.google.android.youtube 

com.e8tracks 

com.vlingo.midas 

com.google.android.googlequicksearchbox 

com.truecaller 

Logcat output from unedited code when i try to deselect "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

PS. This is my first question, so be gentle. I would also appreciate any advice on how to improve on asking questions ,I tried to include all of the required info, but if you need anything else, please let me know.

like image 653
Mushroomzier Avatar asked Dec 18 '15 09:12

Mushroomzier


People also ask

What happens when you remove the first element of an ArrayList?

If the ArrayList does not contain duplicates, we can simply pass the first element value as an object to be deleted to the remove() method, and it will delete that value. Note: Incase the ArrayList contains duplicates, it will delete the first occurrence of the object passed as a parameter to the remove() method.

How does remove work for Arraylists?

The remove() method is used to remove an element at a specified index from ArrayList. Shifts any subsequent elements to the left (subtracts one from their indices). The index of the element to be removed.

What happens to an ArrayList when you remove?

If you call ArrayList. remove() the element at the given index is removed from the list (and all elements following it move down one index). The object itself still exists, no memory has been freed yet.

How do you remove the first index of an ArrayList?

To remove the first element of a ArrayList, we can use the list. remove() method by passing its index 0 as an argument to it. 0 is the index of an first element.


2 Answers

I think it might be a problem, because ArrayList gives you an opportunity to store equal objects multiple times. Maybe, it is a good idea to use HashSet<String> instead?

 private Set<String> pkgs;
like image 189
RexSplode Avatar answered Oct 17 '22 21:10

RexSplode


Let's consider ArrayList default behaviour:

ArrayList of strings have 5 elements. If you remove element at 2nd position then arraylist will become set of 4 elements and 3rd element now at 2nd position. Now when you remove 5th element but its position is changed now.

So use Arraylist of hashmap and when you want to remove elements from arraylist, you should iterate all elements of arraylist and remove particular element from it.

OR if you want only checked items when some event (like button press) occers then get only that checked items from adapter of list.

like image 21
S. K Avatar answered Oct 17 '22 22:10

S. K