I have some problems updating on a lazy loaded Primesfaces data file. I am using 3.0.M4.
You have three classes, as in your filter example. I also tried the lazy loading example, but then the data was not reloaded in the controller. So I used the second example with filtering. There I get reboot events in the controller (the logger displays "Data loading"). But the table does not show new data :-(. Why?
Who can help here?
Yours faithfully!
LazyCarDataModel
package org.jboss.as.quickstarts.helloworld; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import org.primefaces.model.LazyDataModel; import org.primefaces.model.SortOrder; public class LazyCarDataModel extends LazyDataModel<Car> { private static final long serialVersionUID = 1L; private List<Car> datasource; public LazyCarDataModel(List<Car> datasource) { this.datasource = datasource; } @Override public Car getRowData(String rowKey) { for(Car car : datasource) { if(car.getModel().equals(rowKey)) return car; } return null; } @Override public Object getRowKey(Car car) { return car.getModel(); } @Override public List<Car> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) { List<Car> data = new ArrayList<Car>();
LazyTableBean
package org.jboss.as.quickstarts.helloworld; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.UUID; import javax.enterprise.context.SessionScoped; import javax.inject.Named; import org.primefaces.model.LazyDataModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Named @SessionScoped public class LazyTableBean implements Serializable { private static final long serialVersionUID = 1L; private final static Logger logger = LoggerFactory.getLogger(LazyTableBean.class); private final static String[] colors; private final static String[] manufacturers; private List<Car> cars; static { colors = new String[10]; colors[0] = "Black"; colors[1] = "White"; colors[2] = "Green"; colors[3] = "Red"; colors[4] = "Blue"; colors[5] = "Orange"; colors[6] = "Silver"; colors[7] = "Yellow"; colors[8] = "Brown"; colors[9] = "Maroon"; manufacturers = new String[10]; manufacturers[0] = "Mercedes"; manufacturers[1] = "BMW"; manufacturers[2] = "Volvo"; manufacturers[3] = "Audi"; manufacturers[4] = "Renault"; manufacturers[5] = "Opel"; manufacturers[6] = "Volkswagen"; manufacturers[7] = "Chrysler"; manufacturers[8] = "Ferrari"; manufacturers[9] = "Ford"; } private LazyCarDataModel lazyModel; private Car selectedCar; public LazyTableBean() { cars = new ArrayList<Car>(); populateLazyRandomCars(cars, 100000); lazyModel = new LazyCarDataModel(cars); } public Car getSelectedCar() { return selectedCar; } public void setSelectedCar(Car selectedCar) { this.selectedCar = selectedCar; } public LazyDataModel<Car> getLazyModel() { return lazyModel; } private void populateLazyRandomCars(List<Car> list, int size) { System.out.println("Loading data"); for(int i = 0 ; i < size ; i++) { list.add(new Car(getRandomModel(), getRandomYear(), getRandomManufacturer(), getRandomColor())); } } private String getRandomColor() { return colors[(int) (Math.random() * 10)]; } private String getRandomManufacturer() { return manufacturers[(int) (Math.random() * 10)]; } private int getRandomYear() { return (int) (Math.random() * 50 + 1960); } private String getRandomModel() { return UUID.randomUUID().toString().substring(0, 8); } }
And here is xhtml:
<?xml version="1.0" encoding="UTF-8"?> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui" template="template-default.xhtml"> <ui:define name="content"> <h:form> <p:dataTable var="car" value="#{lazyTableBean.lazyModel}" paginator="true" rows="10" lazy="true" paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" rowsPerPageTemplate="5,10,15" selection="#{lazyTableBean.selectedCar}" selectionMode="single"> <p:ajax event="rowSelect" listener="#{lazyTableBean.onRowSelect}" update=":form:display" oncomplete="carDialog.show()" /> <p:column headerText="Model"> <h:outputText value="#{car.model}" /> </p:column> <p:column headerText="Year"> <h:outputText value="#{car.year}" /> </p:column> <p:column headerText="Manufacturer"> <h:outputText value="#{car.manufacturer}" /> </p:column> <p:column headerText="Color"> <h:outputText value="#{car.color}" /> </p:column> </p:dataTable> <p:dialog header="Car Detail" widgetVar="carDialog" resizable="false" width="200" showEffect="explode" hideEffect="explode"> <h:panelGrid id="display" columns="2" cellpadding="4"> <f:facet name="header"> <p:graphicImage value="/images/cars/#{lazyTableBean.selectedCar.manufacturer}.jpg" /> </f:facet> <h:outputText value="Model:" /> <h:outputText value="#{lazyTableBean.selectedCar.model}" /> <h:outputText value="Year:" /> <h:outputText value="#{lazyTableBean.selectedCar.year}" /> <h:outputText value="Manufacturer:" /> <h:outputText value="#{lazyTableBean.selectedCar.manufacturer}" /> <h:outputText value="Color:" /> <h:outputText value="#{lazyTableBean.selectedCar.color}" /> </h:panelGrid> </p:dialog> </h:form> </ui:define> </ui:composition>
Mikeo source share