【发布时间】:2015-12-18 17:41:14
【问题描述】:
我有一个 ArrayList<String> 用于存储 PackageInfo(arraylist 中的一个元素示例是“com.skype.raider”)。
arralist 初始化如下:
private List<String> pkgs;
在类构造函数中
pkgs = new ArrayList<>();
当我调用pkgs.remove(String) 时,它不起作用,但当我反复尝试删除时,它最终起作用了。
以下是我如何测试删除是否有效(我编辑了代码,以便更容易阅读)
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
}
}
}
这是未编辑的 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);
}
}
}
});
作为一个例子,我已经包含了我通过迭代列表获得的 arraylists 内容。 以及我的测试的日志输出
列表内容:
com.sbg.mobile.phone
com.google.android.youtube
com.e8tracks
com.vlingo.midas
com.google.android.googlequicksearchbox
com.truecaller
当我尝试取消选择“com.sbg.mobile.phone”时,未编辑代码的 Logcat 输出
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。这是我的第一个问题,所以要温柔。 我也很感激任何关于如何改进提问的建议,我试图包含所有必需的信息,但如果您需要任何其他信息,请告诉我。
【问题讨论】:
-
您确定您的 ArrayList 在您第一次尝试删除它时包含给定的字符串吗?
-
int position = pkgs .indexOf("yourtext");然后 pkgs .remove(position );
-
不明白为什么要使用“isChecked”来验证字符串是否仍在数组中...您应该只使用
pkgs.contains(...),其他什么都不重要。 -
@mithrop 我并没有真正使用 isChecked 来验证它是否仍在数组列表中,我只是用它来衡量我试图实现的目标的成功或失败。
-
@koutuk 我尝试使用位置,但似乎没有解决它,而是使用 HashSet 代替工作