Sé que esta pregunta es bastante antigua, pero acabo de trabajar en esto, así que pensé que compartiría mi solución para el futuro.
Estamos utilizando PrimeFaces 3,5
Esto sólo fue implementado en una mesa de carga lenta y nunca puestos en práctica en una tabla en memoria. La mayor diferencia que podría existir es que necesitaría almacenar el tipo de columna (Clase) para una tabla en memoria.
Antes que nada, necesita algún tipo de controlador SessionScoped al que pueda guardar el estado de ordenación. Necesitará almacenar dos estados: ordenar columna y ordenar orden (ascendente/descendente).
En segundo lugar, vincule p: datatable a un objeto en su controlador ViewScoped (binding="#{viewController.datatable}"
) e implemente el getter y el setter básicos para él. En el método de la moda, tengo esto:
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;
}
Los bits importantes son las líneas setValueExpression, el segundo parámetro del método createValueExpression requiere la expresión estilo JSF, es decir: #{pojo.stuff}
. También observe cómo estoy usando Object.class como tipo, creo que puedo salirse con la tuya porque la tabla está cargada y estoy manejando toda la clasificación en la implementación de LazyDataModel.
En tercer lugar, añadir el evento de clasificación a la tabla de datos:
<p:ajax event="sort" listener="#{viewController.sortListener}" />
y el oyente en el controlador:
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);
}
Eso es todo.
¿Alguna de las entradas para esta pregunta? – user1234
@BalusC ¿Alguna ayuda en esto? – user1234