PrimeFaces 自动完成 groupBy 仅适用于排序条目

问题描述 投票:0回答:1

我正在使用 PrimeFaces autoComplete 和 groupBy 函数。

<h:form>
    <p:autoComplete placeholder="Select something"
                    size="27"
                    dropdown="true"
                    forceSelection="true"
                    var="value"
                    itemLabel="#{value}"
                    itemValue="#{value}"
                    value="#{autoCompleteGroupByBean.selection}"
                    completeMethod="#{autoCompleteGroupByBean.complete}"
                    groupBy="#{autoCompleteGroupByBean.getGroup(value)}" />
</h:form>
package org.primefaces.test.view;

import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

@Setter
@Getter
@Named
@ViewScoped
public class AutoCompleteGroupByBean implements Serializable {

    private List<String> values;
    private List<String> groups;
    private String selection;

    @PostConstruct
    public void initialize() {
        values = Arrays.asList(
                "ABC value0", "ABC value1", "ABC value2", "ABC value3",
                "DEF value0", "DEF value1", "DEF value2", "DEF value3",
                "GHI value0", "GHI value1", "GHI value2", "GHI value3");
        // If the values are not ordered, groups are occuring multiple times
        // Collections.shuffle(values);
        groups = Arrays.asList("ABC", "DEF", "GHI");
    }

    public List<String> complete(final String query) {
        return values.stream()
                .filter(v -> StringUtils.containsIgnoreCase(v, query))
                .collect(Collectors.toList());
    }

    public String getGroup(final String value) {
        return groups.stream()
                .filter(g -> StringUtils.startsWithIgnoreCase(value, g))
                .findAny()
                .orElse("MISC");
    }
}

如果值是有序的,它就可以正确工作:

如果值未排序(我在示例中使用

Collections.shuffle()
来执行此操作),则组会出现多次:

在我的实际项目中,我从外部服务获取值,并且组并不总是像示例中那样位于条目的开头。 有什么方法可以避免重复的组或者我需要提前对所有值进行排序吗?

感谢您的帮助!

java primefaces
1个回答
0
投票

按照建议,我通过按组对所有值进行排序来解决这个问题。

PrimeFaces 文档中未记录

groupBy
。更容易理解的是,需要对值进行排序才能使其工作。

© www.soinside.com 2019 - 2024. All rights reserved.