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