我正在寻找一种解决方案,我想使用逻辑 OR 过滤具有多个值的容器。
例如,我想过滤我的值并获得 value == "A" 或 "B" 的结果
当我只有 1 个值时,这段代码有效:
private void applyTextFilters(List<String> filters)
{
unselectAllItems();
IndexedContainer container = (IndexedContainer) valuesTable.getContainerDataSource();
container.removeContainerFilters(Columns.SEARCH.id());
for (String filter : filters) {
container.addContainerFilter(Columns.SEARCH.id(), filter, true, false);
}
clinicalValuesGraph.refreshGraph(container, getLabel("clinicalvalues.graph.caption"));
// if it is the case ...
//toggleEmptyResultNotification();
handleView(viewMode);
}
我错过了什么?同样,如果我的代码中有 2 个过滤器(“A”、“B”),则不会显示任何结果,但如果我通过“A”,它会起作用。
跟着我的问题...
使用 6.5.7,我需要使用 2 个条件过滤我的容器,如“patrick”或“john”等搜索名称。
我检查了代码,这是我需要修改方法(受保护)的地方:
protected boolean passesFilters(Object itemId) {
IndexedContainerItem item = new IndexedContainerItem(itemId);
if (filters == null) {
return true;
}
final Iterator<Filter> i = filters.iterator();
while (i.hasNext()) {
final Filter f = i.next();
if (!f.passesFilter(item)) {
return false;
}
}
return true;
}
对此:
protected boolean passesFilters(Object itemId) {
IndexedContainerItem item = new IndexedContainerItem(itemId);
if (filters == null) {
return true;
}
boolean previouslyPassedFilter = false;
boolean PassesFilter = true;
final Iterator<Filter> i = filters.iterator();
while (i.hasNext()) {
final Filter f = i.next();
if (!f.passesFilter(item) && !previouslyPassedFilter) {
passesFilter = false;
} else {
previouslyPassedFilter = true;
}
}
return passesFilter ;
}
如果不必重写所有这些类(IndexedContainer、IndexContainerItem...),如何做到这一点?