如何基于map值在JSF dataTable上实现多重排序

时间:2014-10-20 12:02:53

标签: sorting jsf primefaces datatable

我试图对可通过地图结构(在其值中)访问的列表进行排序,如下所示:

<ui:param name="currentKey" value="..." />
<p:dataTable value="#{bean.map[currentKey].currentList}" sortMode="multiple">
    ...
</p:dataTable>

和相应的bean

class Bean {
    HashMap<Object, MyDataModel> map; // + getter
}

class MyDataModel {
    List<Object> currentList; // + getter
}

但是我得到了描述的例外:

  

多选参考必须是数组或数据表的列表

如何currentList属性可以访问sortMode="multiple"

注意:我还尝试使用HashMap<Object, List<Object>> map的简单版本和value="#{bean.map[currentKey]}"等xhtml代码,并获得相同的例外。

  • JSF 2
  • Primefaces 5.0

1 个答案:

答案 0 :(得分:2)

我自己找到了解决方案。

对于这种特定情况,其中p:dataTable的列表值存储在地图结构中,我需要区分每个表的排序(在我的支持bean中声明的private HashMap<Object, ArrayList<SortMeta>> objectSortMapping;)。 / p>

解决方案是为支持bean中的每个列表(在List<MetaSort>中)定义map - 引用要排序的UIColumn首选项。

ArrayList<SortMeta> sortMeta = new ArrayList<>();
UIComponent viewRoot = getFacesContext().getViewRoot();
UIComponent component = viewRoot.findComponent(":idPathTo:column1");

SortMeta sortMetaColumn = new SortMeta();
sortMetaColumn.setSortBy((UIColumn) component);
sortMetaColumn.setSortOrder(SortOrder.ASCENDING);
sortMetaColumn.setSortField("column1");
sortMeta.add(sortMetaColumn);

xhtml看起来像

<ui:param name="currentKey" value="..." />
<p:dataTable value="#{bean.map[currentKey].currentList}" var="item"
             sortMode="multiple"
             sortBy="#{bean.objectSortMapping[currentKey]}">
    <p:column id="column1" sortBy="#{item.property}">
        ...
    </p:column>
</p:dataTable>

希望这有助于某人。