android - 当我尝试取消选择多个选中的复选框时出现 IndexOutOfBoundsException
问题描述
我有一个代码,我可以在其中检查多个复选框并在 textview 中显示文本。当我取消选中特定的复选框时,应该删除文本。但是当我尝试这样做时,我面临着 IOBException。
在 userItemsList.remove(position) 出现错误
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
mBuilder.setTitle("Available Courses");
mBuilder.setMultiChoiceItems(courseItems, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int position, boolean isChecked) {
if (isChecked){
if (!userItemsList.contains(position)){
userItemsList.add(position);
}
}else if (userItemsList.contains(position)){
userItemsList.remove(position);
}
}
});
mBuilder.setCancelable(false);
mBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
StringBuilder item = new StringBuilder();
for (int i=0; i < userItemsList.size(); i++){
item.append(courseItems[userItemsList.get(i)]);
if (i != userItemsList.size()-1){
item.append(",");
}
}
textView.setText(item.toString());
}
});
mBuilder.setNegativeButton("Dismiss", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
mBuilder.setNeutralButton("Clear All", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
for (int n = 0; n < checkedItems.length; n++){
checkedItems[n] = false;
userItemsList.clear();
textView.setText("");
}
}
});
AlertDialog mDialog = mBuilder.create();
mDialog.show();
}
});
解决方案
您正在将 Dialogs 位置添加到列表中,这就是它抛出 IOB 异常的原因。您应该将项目名称添加到 List 并检查它是否存在..
我已经更新了你的代码。测试了它。现在可以正常工作了!
String[] courseItems = new String[]{"a", "x", "b", "c" };
boolean[] checkedItems = new boolean[]{false, false, false, false };
List<String> userItemsList;
AlertDialog.Builder mBuilder = new AlertDialog.Builder(Splash.this);
mBuilder.setTitle("Available Courses");
mBuilder.setMultiChoiceItems(courseItems, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int position, boolean isChecked) {
if (isChecked) {
if (!userItemsList.contains(courseItems[position])) {
userItemsList.add(courseItems[position]);
}
} else if (userItemsList.contains(courseItems[position])) {
userItemsList.remove(courseItems[position]);
}
}
});
mBuilder.setCancelable(false);
mBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
StringBuilder item = new StringBuilder();
for (int i=0; i < userItemsList.size(); i++){
item.append(userItemsList.get(i));
if (i != userItemsList.size()-1){
item.append(",");
}
}
textView.setText(item.toString());
}
});
mBuilder.setNegativeButton("Dismiss", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
mBuilder.setNeutralButton("Clear All", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
for (int n = 0; n < checkedItems.length; n++){
checkedItems[n] = false;
userItemsList.clear();
textView.setText("");
}
}
});
AlertDialog mDialog = mBuilder.create();
mDialog.show();
快乐编码:)
推荐阅读
- android - 如何从 URL 获取图像资源
- jquery - 将 jquery 添加到 django
- c++ - 如何理解新操作符重载?
- qt - 如何正确连接 QProgressBar 和 QFutureWatcher?
- node.js - 进不了路由器进快递
- python - 通过选择或任何其他方法从用户添加部分/集群以 html 结尾
- laravel - 如何在 Eloquent 的电子邮件中排除具有特殊字符的员工
- c# - 此外,密码保护作为 Azure WebApp 托管的 ASP.NET Core MVC 网站,并使用现有身份验证
- delphi - 进度达到 100 时停止播放 WAV 文件
- java - 在 Android Studio 中使用 OnCompletionListener 播放多个媒体播放器