我想在点击某个按钮时清除ListView中的所有内容。我试图通过索引删除它,但它给了我例外。我没有完全得到ListView的SelectionModel。以下是我的尝试:
asiLogsListView.getSelectionModel().selectAll();
ObservableList<Integer> indices = asiLogsListView.getSelectionModel().getSelectedIndices();
for(int index : indices) {
asiLogsListView.getSelectionModel().getSelectedItems().remove(index);
}
或
asiLogsListView.getSelectionModel().getSelectedItems().removeAll(indices);
答案 0 :(得分:10)
要清除ListView
中的所有项目,只需执行
asiLogsListView.getItems().clear();
如果要清除选择,请执行
asiLogsListView.getSelectionModel().clearSelection();
棘手的是从ListView
List<Integer> selectedItemsCopy = new ArrayList<>(asiLogsListView.getSelectionModel().getSelectedItems());
asiLogsListView.getItems().removeAll(selectedItemsCopy);
您的代码似乎正在尝试清除选择,因为您尝试从selectionModel
selectedItems
列表中删除所有元素。问题在于,当您删除每个项目时,其余项目的索引会发生变化,因此您最终会删除错误的项目,最终可能会导致ArrayIndexOutOfBoundsException
s(如果您的项目数量少于所选项目的最大索引。)
答案 1 :(得分:2)
原始问题是:ListView.getSelectionMode()返回其可观察列表的一部分,但不返回副本。因此,从该列表中删除会导致各种问题。
使用下一个代码复制列表,然后再从中删除项目:
sendRightButton.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
ObservableList<String> potential =
FXCollections.observableArrayList( //copy
candidatesListView.getSelectionModel().getSelectedItems());
if (potential != null) {
heroes.addAll(potential);
candidates.removeAll(potential);
candidatesListView.getSelectionModel().clearSelection();
}
}
});