我有一个与ObservableList上的过滤器有关的问题。我的代码工作正常,但我觉得太慢了。这是因为我在应用程序开始时加载了40,000个订单,之后应用程序继续接收订单,但是现在我只在初始加载时遇到问题。我的主要问题是我的原始订单集的副本相当慢,为什么?因为我在changeListener中的代码我认为可能会更好..但我还没有找到解决方案。那么这是我的代码的一个例子。
public MainController()
{
filteredData.addAll(Repository.masterObservableList);
Repository.masterObservableList.addListener(new ListChangeListener<OrderVo>()
{
@Override
public void onChanged(ListChangeListener.Change<? extends OrderVo> change)
{
filteredData.clear();
for (OrderVo o : Repository.masterObservableList)
filteredData.add(o);
}
});
}
}
我会稍微解释一下代码。 “Repository”是一个单例,masterObservableList是一个ObservableList,并且名称是..是“master”或者是原始的。 filteredData也是一个ObservableList,但只在我的fxml(MainController)的控制器中声明,并作为主集合的副本。每次我的主集合收到更改(更新或新订单)时,filteredData应该应用该更改..但是我为每次迭代执行一次这是问题,因为它可以工作但是太慢了。为什么我说这很慢?因为在开始时我使用主集合作为显示订单的TableView的数据提供者,并且它工作快速而干净。之后,我想在表格中添加过滤器,当我开始进行研究并找到过滤后的数据和其他方法时...我保持这种方法(是一个更大的代码,但主要问题在这里)..和它工作..但开始加载订单的时间比以前多1:30分钟..所以,伙计们,如果你有任何想法!如何保持filteredData更新而不在changeListener中为每个更新,我将非常高兴和感激。谢谢你的阅读!
答案 0 :(得分:0)
每次masterObservableList更改时,您的算法都会强制重置filteredData的所有元素。 这太详尽了,因为可以在添加或删除每个项目时触发侦听器。 也许最好只添加或删除已更改的元素?
Repository.masterObservableList.addListener(new ListChangeListener<OrderVo>()
{
@Override
public void onChanged(ListChangeListener.Change<? extends OrderVo> change)
{
while(change.next()) {
if(change.wasAdded()) {
List added = change.getAddedSubList();
//add those elements to your data
}
if(change.wasRemoved()) {
List removed = change.getRemoved();
//remove those elements from your data
}
}
}
});
}