Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList.Remove在第一次调用时不起作用_Java_Android_Arraylist - Fatal编程技术网

Java ArrayList.Remove在第一次调用时不起作用

Java ArrayList.Remove在第一次调用时不起作用,java,android,arraylist,Java,Android,Arraylist,我有一个ArrayList,用于存储PackageInfo(ArrayList中的一个元素示例是“com.skype.raider”) arralist的初始化如下所示: private List<String> pkgs; 这是未编辑的onclick事件 RelativeLayout rl_container = (RelativeLayout) child.findViewById(R.id.rl_container); rl_conta

我有一个
ArrayList
,用于存储PackageInfo(ArrayList中的一个元素示例是“com.skype.raider”)

arralist的初始化如下所示:

    private List<String> pkgs;

这是未编辑的onclick事件

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


                    }
                });
作为一个例子,我包含了通过遍历列表得到的ArrayList内容。 以及我测试的日志输出

列表内容:

com.sbg.mobile.phone

com.google.android.youtube 

com.e8tracks 

com.vlingo.midas 

com.google.android.googlequicksearchbox 

com.truecaller 
尝试取消选择“com.sbg.mobile.phone”时未编辑代码的Logcat输出

这是我的第一个问题,所以要温柔。
如果您能给我一些关于如何改进提问的建议,我会非常感激。我试图提供所有必需的信息,但如果您还需要其他信息,请告诉我。

我认为这可能是个问题,因为
ArrayList
为您提供了多次存储相同对象的机会。也许,使用
HashSet
代替是个好主意

 private Set<String> pkgs;
private-Set-pkgs;

>P>让我们考虑ARARYLIST默认行为:

字符串的ArrayList有5个元素。若移除第二个位置的元素,那个么arraylist将变成4个元素的集合,第三个元素现在位于第二个位置。现在,当您删除第5个元素,但其位置现在已更改

所以使用hashmap的Arraylist,当您想从Arraylist中删除元素时,应该迭代Arraylist的所有元素,并从中删除特定的元素


或者,当某些事件(如按下按钮)发生时,如果您只想要选中的项目,则仅从列表的适配器获取选中的项目

问题出在你的情况下。条件应如下所示:

    if (checked) {
        if (!pkgs.contains(m_pkg)) {
            pkgs.add(m_pkg);
        }
    } else {
        if (pkgs.contains(m_pkg)) {
            pkgs.remove(m_pkg);
        }
    }
您可以参考以下链接:


第一次尝试删除ArrayList时,您确定它包含给定的字符串吗?int position=pkgs.indexOf(“yourtext”);然后包装。移除(位置);不明白为什么要使用“isChecked”来验证字符串是否仍在arry中。。。你应该只使用
pkgs.contains(…)
,没有其他真正重要的东西。@mithrop我没有真正使用isChecked来验证它是否仍在arraylist中,我只是用它来衡量我试图实现的目标的成功或失败。@koutuk我尝试使用position,但似乎没有解决它,用HASSET而不是感谢你的答案,我会给你一个机会,回到你身边。谢谢你,RexSplode,这是问题。谢谢你的回答。S.K,我确实考虑了这个问题,但事实证明这是另一个问题,请看所接受的答案谢谢你的回答,逻辑上这两个条件是一样的。问题不在于条件失败,而是我使用的容器有问题,但是你的条件格式更好,我已经将我的条件更改为使用你的。
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
 private Set<String> pkgs;
    if (checked) {
        if (!pkgs.contains(m_pkg)) {
            pkgs.add(m_pkg);
        }
    } else {
        if (pkgs.contains(m_pkg)) {
            pkgs.remove(m_pkg);
        }
    }