1

我正在寻找一种解决方案,我想使用逻辑 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...),如何做到这一点?

4

0 回答 0