AlertDialog.Builder的setMultiChoiceItems方法在某些情况下可能会出现奇怪的行为,例如当使用一个数组来设置多个选择项时,勾选某一项后,其他项也会被勾选。这是因为setMultiChoiceItems方法中的选择项是使用一个boolean数组来表示的,而数组的值会被共享。
要解决这个问题,可以使用一个ArrayList来保存选择项的状态,并在对话框展示时动态地设置选择项的状态。
下面是一个示例代码:
final String[] items = {"Item 1", "Item 2", "Item 3", "Item 4"};
final boolean[] checkedItems = new boolean[items.length];
final ArrayList selectedItems = new ArrayList<>();
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Select Items");
builder.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
selectedItems.add(which);
} else {
selectedItems.remove(Integer.valueOf(which));
}
}
});
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 处理选择项
for (int i : selectedItems) {
// Do something with the selected items
Log.d("Selected Item", items[i]);
}
}
});
builder.setNegativeButton("Cancel", null);
AlertDialog dialog = builder.create();
dialog.show();
在上述代码中,我们使用一个boolean数组checkedItems来表示选择项的状态。同时,我们使用一个ArrayList selectedItems来保存选中的项的索引。当用户点击选择项时,我们根据isChecked的值来更新selectedItems。最后,在确定按钮的点击事件里,我们可以遍历selectedItems来处理选中的项。
这样就可以解决setMultiChoiceItems方法的奇怪行为问题。