Depois de implementar esse Lazy o sortBy do primefaces parou de funcionar.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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