java排序ObservableList时引发的更改通知数
我在玩JavaFX时,偶然发现了Oracle的Using JavaFX Collections教程,并遇到了一个问题。在示例1-6中,他们使用FXCollections
对ObservableList
进行排序:
List<String> list = new ArrayList<String>();
list.add("d");
list.add("b");
list.add("a");
list.add("c");
ObservableList<String> observableList = FXCollections.observableList(list);
observableList.addListener(new ListChangeListener() {
@Override
public void onChanged(ListChangeListener.Change change) {
System.out.println("Detected a change! ");
}
});
FXCollections.sort(observableList); // one notification, as expected
// Collections.sort(observableList); // also only one notification. why?
根据本教程,仅打印一个更改通知。本教程提到,当使用Collections.sort()
而不是FXCollections.sort()
时,将有四个更改通知,但我仍然只收到一个。你知道为什么吗?需要做什么才能获得四个更改通知
# 1 楼答案
从
SortableList
API(似乎无法在线找到javadoc):基本上:
ObservableList
上调用FXCollections.sort
,它是SortableList
的后代FXCollections.sort
将ObservableList
强制转换为SortableList
,并调用((SortableList<? extends T>)list).sort();
com.sun.javafx.collections.ObservableListWrapper
注意(I):JDK8u45的源代码
FXCollections.sort
这里注(二)的来源
ObservableListWrapper.sort
如您所见,
fireChange
调用在实际执行排序后触发一次更新
{}习惯用法调用{}。
在Java8中,
List.sort
实际上有一个default
实现,但是这里没有使用它,因为它被重写了,所以现有的机制仍然来自ObservableListWrapper
TL;DR
我怀疑是否有任何优雅的方法可以获得与对
List
进行排序所需的操作数一样多的通知,除非您使用自己的ObservableList
实现快速把戏(在Java 8中测试)
我刚刚发现了一个触发多个
Changed
事件的技巧如果您使用以下习惯用法:
Collections.sort(observableList.subList(0, observableList.size()));
原因是}
subList
将返回一个List
,因此将使用default
{