Reputation: 314
I have a HashMap in mybean:
private ArrayList<HashMap<String,Object>> searchResult;
and I can successfully display data from it as a table:
<p:dataTable id="resultTable" var="result" value="#{myBean.searchResult}">
<p:column headerText="Name">
<h:outputText value="#{result.NAME}" />
</p:column>
<p:column headerText="Amount">
<h:outputText value="#{result.AMOUNT}" />
</p:column>
<p:column headerText="Date1">
<h:outputText value="#{result.DATE1}" />
</p:column>
<p:column headerText="Date2">
<h:outputText value="#{result.DATE2}" />
</p:column>
</p:dataTable>
Problem is that I don't know how many keys HashMap will have (DATE1, DATE2, ... DATEN). How to create such a dataTable with all values and their keys as headers?
UPD. Comparing to showcase about Cars from an answer below, difference is, that class Car has attributes as brand, year, color etc, but in my case you don't know all columns before execution. So i slightly modified an example. Maybe someone will find my solution useful.
myForm.xhtml (the same as in example):
<p:dataTable id="searchResults" var="result" value="#{myBean.searchResult}">
<p:columns value="#{myBean.columns}" var="column" columnIndexVar="colIndex">
<f:facet name="header">
<h:outputText value="#{column.header}" />
</f:facet>
<h:outputText value="#{result[column.property]}" />
</p:columns>
</p:dataTable>
myBean.java (ColumnModel the same as in the example showcase):
private ArrayList<HashMap<String,Object>> searchResult;
private List<ColumnModel> columns;
private void createColumns(ArrayList<String> selectedDates){
columns = new ArrayList<ColumnModel>();
columns.add(new ColumnModel("Name", "NAME"));
columns.add(new ColumnModel("Amount", "AMOUNT"));
for (int i = 0; i < selectedDates.size(); i++) {
columns.add(new ColumnModel(selectedDates.get(i), "DATE" + i));
}
setColumns(columns);
}
Upvotes: 1
Views: 3123
Reputation: 38
You can use the p:columns
component described in PrimeFaces ShowCase:
<p:dataTable id="cars" var="car" value="#{dtColumnsView.cars}" widgetVar="carsTable" filteredValue="#{dtColumnsView.filteredCars}">
<p:columns value="#{dtColumnsView.columns}" var="column" columnIndexVar="colIndex" sortBy="#{car[column.property]}" filterBy="#{car[column.property]}">
<f:facet name="header">
<h:outputText value="#{column.header}" />
</f:facet>
<h:outputText value="#{car[column.property]}" />
</p:columns>
</p:dataTable>
Upvotes: 1