Depois de implementar esse Lazy o sortBy do primefaces parou de funcionar.
Depois de implementar esse Lazy o sortBy do primefaces parou de funcionar.
Oi Eduardo, tudo bem?
você poderia passar o seu código para dar uma olhada?
Obrigado!
Segue o código do livro.xhtml
<h:form id="formTabelaLivros">
<p:dataTable id="tabelaLivros" value="#{livroBean.livroDataModel}" rows="5" paginator="true" lazy="true"
var="livro" widgetVar="tabelaLivros">
<f:facet name="header">Livros</f:facet>
<p:column headerText="Título" sortBy="#{livro.titulo}" filterBy="#{livro.titulo}" filterMatchMode="startsWith">
<h:outputText value="#{livro.titulo}" />
</p:column>
<p:column headerText="Gênero" sortBy="#{livro.genero}"
filterBy="#{livro.genero}" filterMatchMode="startsWith">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('tabelaLivros').filter()">
<f:selectItem itemLabel="Selecione..." itemValue="#{null}"
noSelectionOption="true" />
<f:selectItems value="#{livroBean.generos}" />
</p:selectOneMenu>
</f:facet>
<h:outputText value="#{livro.genero}" />
</p:column>
<p:column headerText="ISBN" sortBy="#{livro.isbn}" filterBy="#{livro.isbn}" filterMatchMode="contains">
<h:outputText value="#{livro.isbn}" />
</p:column>
<p:column headerText="Preço" sortBy="#{livro.preco}">
<h:outputText value="#{livro.preco}" />
</p:column>
<p:column headerText="Data" sortBy="#{livro.dataLancamento.time}" filterBy="#{livro.dataLancamento}" filterMatchMode="contains">
<h:outputText value="#{livro.dataLancamento.time}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm"
timeZone="America/Sao_Paulo" />
</h:outputText>
</p:column>
<p:column headerText="Atualizar" >
<h:commandLink value="atualizar"
action="#{livroBean.carregar(livro)}" />
</p:column>
<p:column headerText="Remover">
<h:commandLink value="remover" action="#{livroBean.remover(livro)}" />
</p:column>
</p:dataTable>
</h:form>
Fala Eduardo!
o seu método load deve ficar assim:
public List<Livro> load(int inicio, int quantidade, String campoOrdenacao, SortOrder sentidoOrdenacao,
Map<String, Object> filtros) {
String titulo = (String) filtros.get("titulo");
List<Livro> data = dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo);
// sort
if (campoOrdenacao != null) {
Collections.sort(data, new LazySorter(campoOrdenacao, sentidoOrdenacao));
}
return data;
}
e precisaria criar a classe LazySorter que ficaria assim:
public class LazySorter implements Comparator<Livro> {
private String sortField;
private SortOrder sortOrder;
public LazySorter(String sortField, SortOrder sortOrder) {
this.sortField = sortField;
this.sortOrder = sortOrder;
}
public int compare(Livro livro1, Livro livro2) {
try {
Field field = Livro.class.getDeclaredField(this.sortField);
field.setAccessible(true);
Object value1 = field.get(livro1);
Object value2 = field.get(livro2);
field.setAccessible(false);
int value = ((Comparable) value1).compareTo(value2);
return SortOrder.ASCENDING.equals(sortOrder) ? value : -1 * value;
} catch (Exception e) {
throw new RuntimeException();
}
}
}
no showcase do primefaces é possível ver outros códigos desse tipo:
https://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml
Espero ter ajudado =)
Samir Bravo,
Funcionou perfeito depois da sua dica!!! apenas seleção por gênero ainda não funcionou