So che questa domanda è piuttosto vecchia, ma ho appena lavorato su questo quindi ho pensato di condividere la mia soluzione per il futuro.
Stiamo utilizzando primefaces 3,5
Questa è stata implementata solo su un tavolo di carico pigro e mai attuata su una tabella in memoria. La più grande differenza che potrebbe esistere è che è necessario memorizzare il tipo di colonna (Classe) per una tabella in memoria.
Prima di tutto, è necessario un tipo di controller SessionScoped su cui è possibile salvare lo stato di ordinamento. È necessario memorizzare due stati: ordina la colonna e ordina (crescente/decrescente).
In secondo luogo, associare il p: datatable a un oggetto nel controller ViewScoped (binding="#{viewController.datatable}"
) e implementare il getter e il setter di base per esso. Nel metodo setter, ho questo:
public void setDatatable(DataTable datatable) {
ExpressionFactory expressionFactory = ExpressionFactory.newInstance();
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
if(!datatableInitialized) {
if(getSessionController().getSortState() == null) {
datatable.setValueExpression("sortBy", expressionFactory.createValueExpression(elContext, DEFAULT_SORT_COLUMN, Object.class));
datatable.setSortOrder(DEFAULT_SORT_DIRECTION);
} else {
SortState state = getSessionController().getSortState();
datatable.setValueExpression("sortBy", expressionFactory.createValueExpression(elContext, state.getValueExpression(), Object.class));
datatable.setSortOrder(state.getDirection());
}
datatableInitialized = true;
}
this.datatable = datatable;
}
I bit importanti sono le linee setValueExpression, il secondo parametro del metodo createValueExpression richiede l'espressione stile JSF, cioè: #{pojo.stuff}
. Notate anche come sto usando Object.class come tipo, credo di poterla fare franca perché la tabella è pigra e sto gestendo tutto me stesso nell'implementazione di LazyDataModel.
In terzo luogo, aggiungere l'evento di smistamento al DataTable:
<p:ajax event="sort" listener="#{viewController.sortListener}" />
e l'ascoltatore nel controller:
public void sortListener(SortEvent event) {
SortState state = new SortState();
state.setValueExpression(event.getSortColumn().getValueExpression("sortBy").getExpressionString());
state.setDirection(event.isAscending() ? "ascending" : "descending");
getSessionController().setOpportunitiesSortState(state);
}
Questo è tutto.
Qualsiasi input per questa domanda? – user1234
@BalusC qualche aiuto su questo? – user1234