[RESOLVIDO] Primefaces - Datatable + paginação com problema

Pessoal estou utilizando:

  • Primefaces 3.1.1
  • JSF 2

Estou tendo problemas com a paginação no datatable, tanto usando normalmente quanto com o metodo lazy.

O meu datatable retorna o resultado de uma pesquisa, paginando-a.
Porem ao passar de página exemplo estou na página 3.
E efetuar uma nova pesquisa, o datatable modifica os valores porem ainda permanece na página 3, não voltando para a página inicial.

Tem como resolver isso??? Se alguem passou por isso tem como mostrar a solução aplicada.

[quote=dsrodrigues]Votlando ao assunto pq ainda não resolvi o problema, corri atraz mas nada.
Então resolvi ilustrar o problema e disponibilizar para o pessoal ver (pode até ser erro de programação).

Exemplo de como estou fazendo

1 - Selecione(Clique) uma pasta da ávore a esquerda.
2 - Clique na página 2 ou 3. (pode ser qualquer página)
3 - Selecione(Clique) outra pasta da ávore a esquerda.
Resultado: A Datatable ainda fica na página da lista anterior, não sendo atualizada, somente o conteúdo modifica.

Ou teste:
1 - Selecione(Clique) uma pasta da ávore a esquerda.
2 - Clique na ultima página.
3 - Selecione(Clique) outra pasta da ávore a esquerda.
Resultado: A Datatable permance na ultima página do próximo resultado, caso a página do anterio seja maior que o atual, senão fica igual ao exemplo 1.

O código-fonte esta na página tambem, espero que haja solução e que seja um erro meu.[/quote]

Tenta seguir este exemplo: http://javaeeinsights.wordpress.com/2011/04/07/primefaces-datatable-lazyloading-using-hibernate-criteria-api/

Pelo que vi o link, não seria o que preciso.

Esta fazendo a paginação correta, porem se mudo os valores ele não volta para a página inicial.

Ja tentou dar uma update no datatable depois que você muda o numero da pagina?

Voce poderia postar os codigos do bean e do xhtml para darmos uma olhada? Está usando algum EJB ? etc?

flw

xhtml

					<p:tree id="docTree" value="#{pastaCtrl.root}" var="folderType"
						selectionMode="single" selection="#{pastaCtrl.selectedNode}"
						expandAnim="FADE_IN" collapseAnim="FADE_OUT"
						style="cursor:pointer" dynamic="true" cache="true">

						<p:ajax event="select"
							listener="#{docCtrl.onSelectFolder(folderType)}"
							update=":resultsForm,:searchForm" />
						<p:ajax event="expand" listener="#{pastaCtrl.onNodeExpand}"
							update=":form:docTree" />

						<p:treeNode expandedIcon="ui-icon-folder-open"
							collapsedIcon="ui-icon-folder-collapsed">
							<h:outputText value="#{folderType.name}" />
						</p:treeNode>

					</p:tree>
...
					<p:dataTable id="searchTable" widgetVar="docsTable"
						value="#{docCtrl.lazyModel}" var="doc" rowKey="#{doc.docId}"
						rows="15" emptyMessage="#{msg.tableNoRecordsFound}"
						paginatorAlwaysVisible="false" paginator="true"
						paginatorPosition="bottom" style="position:relative !important">

						<p:column style="width:400px;" sortBy="#{doc.description}">
							<f:facet name="header">
								<b><h:outputText value="#{msg.description}" /></b>
							</f:facet>
							<h:outputText value="#{doc.description}" />
						</p:column>

						<p:column style="width:219px;" sortBy="#{doc.tipoDoc}">
							<f:facet name="header">
								<b><h:outputText value="#{msg.tipoDoc}" /></b>
							</f:facet>
							<center>
								<h:outputText value="#{doc.tipoDoc}" />
							</center>
						</p:column>

						<p:column style="width:80px;">
							<f:facet name="header">
								<b><h:outputText value="" /></b>
							</f:facet>

							<center>

								<h:commandLink action="#{docCtrl.goToDocViewPage(doc.docId)}">
									<img src="images/icones/doc_icon.png" />
								</h:commandLink>

							</center>
						</p:column>

					</p:dataTable>

bean

...
	public LazyDataModel<DocTO> getLazyModel() {
		return lazyModel;
	}
...
	public void setDocList(List<DocTO> docList) {
		this.docList = docList;
		lazyModel = new DocumentLazyDataModel(docList);
	}
...

lazy

public class DocumentLazyDataModel extends LazyDataModel<DocTO> {

	private static final long serialVersionUID = 1L;

	private List<DocTO> datasource;

	public DocumentLazyDataModel(List<DocTO> datasource) {
		this.datasource = datasource;
	}

	@Override
	public List<DocTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
		List<DocTO> data = new ArrayList<>();

		// filter
		for (DocTO doc : datasource) {
			boolean match = true;

			for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
				try {
					String filterProperty = it.next();
					String filterValue = filters.get(filterProperty);
					String fieldValue = String.valueOf(doc.getClass().getField(filterProperty).get(doc));

					if (filterValue == null || fieldValue.startsWith(filterValue)) {
						match = true;
					} else {
						match = false;
						break;
					}
				} catch (Exception e) {
					match = false;
				}
			}

			if (match) {
				data.add(doc);
			}
		}

		// sort
		if (sortField != null) {
			Collections.sort(data, new LazySorter(sortField, sortOrder));
		}

		// rowCount
		int dataSize = data.size();
		this.setRowCount(dataSize);

		// paginate
		if (dataSize > pageSize) {
			try {
				return new ArrayList<DocTO>(data.subList(first, first + pageSize));
			} catch (IndexOutOfBoundsException e) {
				return new ArrayList<DocTO>(data.subList(first, first + (dataSize % pageSize)));
			}
		} else {
			return data;
		}
	}
}

class LazySorter implements Comparator<DocTO> {

	private String sortField;

	private SortOrder sortOrder;

	public LazySorter(String sortField, SortOrder sortOrder) {
		this.sortField = sortField;
		this.sortOrder = sortOrder;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public int compare(DocTO car1, DocTO car2) {
		try {
			Object value1 = DocTO.class.getField(this.sortField).get(car1);
			Object value2 = DocTO.class.getField(this.sortField).get(car2);

			int value = ((Comparable) value1).compareTo(value2);

			return SortOrder.ASCENDING.equals(sortOrder) ? value : -1 * value;
		} catch (Exception e) {
			throw new RuntimeException();
		}
	}
}

Ao selecionar um item na Tree ele atualiza o componente de datatable.

Alguem?

Votlando ao assunto pq ainda não resolvi o problema, corri atraz mas nada.
Então resolvi ilustrar o problema e disponibilizar para o pessoal ver (pode até ser erro de programação).

Exemplo de como estou fazendo

1 - Selecione(Clique) uma pasta da ávore a esquerda.
2 - Clique na página 2 ou 3. (pode ser qualquer página)
3 - Selecione(Clique) outra pasta da ávore a esquerda.
Resultado: A Datatable ainda fica na página da lista anterior, não sendo atualizada, somente o conteúdo modifica.

Ou teste:
1 - Selecione(Clique) uma pasta da ávore a esquerda.
2 - Clique na ultima página.
3 - Selecione(Clique) outra pasta da ávore a esquerda.
Resultado: A Datatable permance na ultima página do próximo resultado, caso a página do anterio seja maior que o atual, senão fica igual ao exemplo 1.

O código-fonte esta na página tambem, espero que haja solução e que seja um erro meu.

Boa Tarde,

Verificar se a solução abaixo atende:

Solution found --> on client side
widgetVar.getPaginator().setPage(0) !!!
This is working fine.
Thanks to all.

Fonte:
http://forum.primefaces.org/viewtopic.php?f=3&t=17323
http://forum.primefaces.org/viewtopic.php?f=3&t=18936

Funcionou corretamente. Coloquei no oncomplete do ajax e pronto.

Perfeito.

Valeu a ajuda…

Eu uso uma maneira que no meu ver é mais simples:

na Classe DocumentLazyDataModel (usando como exemplo) eu crio um atributo do tipo int: exemplo private int paginaInicial.

E la no managedBean no método que faz a pesquisa eu seto 0 para esse atributo, assim que é chamado o método load eu faço o seguinte teste:

if(paginaInicial == 0){
   first = paginaInicial;
   paginaInicial = 1;
}

Funciona direitinho.

1 curtida