LazyDataModel mit Paginierung, klicken Sie auf nächste oder Letzte Seite hat keine Wirkung
Ich habe so einen code, zeigt er mir die Tabelle mit 10 Zeilen, die Sortierung funktioniert einwandfrei, aber ich habe ein problem, wenn ich auf den nächsten oder letzten Seite - nichts passiert. Zeilen pro Seite auch nicht funktioniert:( Vielleicht ist meine JFS-bean werden soll @ManagedBean statt @Benannte, oder vielleicht Bereich ist eine falsche?
Ich bin mit: netbeans 7.3.1 (glassFish 4 embeded) + primeFaces 3.5
customers_list.xhtml
<h:form id="form">
<p:dataTable var="cust" value="#{CustomersList.customers}" paginator="true" rows="10"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="5,10,15" selectionMode="single" selection="#{CustomersList.selectedCustomer}" id="customerTable" lazy="true">
<p:ajax event="rowSelect" update=":form:display" oncomplete="customerDialog.show()" />
<p:column headerText="Id" sortBy="#{cust.id}">
<h:outputText value="#{cust.id}" />
</p:column>
//rest of view...
</h:form>
CustomersList.java
package pl.;
import pl..utils.LazyCustomerDataModel;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import org.primefaces.model.LazyDataModel;
import pl..entity.Customer;
/**
*
* @author
*/
@Named(value = "CustomersList")
@RequestScoped
public class CustomersList {
@Inject
private CustomerSessionBean customerBean;
private Customer selectedCustomer;
public CustomersList() {
}
public LazyDataModel<Customer> getCustomers() {
return new LazyCustomerDataModel(customerBean);
}
public Customer getSelectedCustomer() {
return selectedCustomer;
}
public void setSelectedCustomer(Customer selectedCustomer) {
this.selectedCustomer = selectedCustomer;
}
}
LazyCustomerDataModel.java
package pl..utils;
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;
import pl..CustomerSessionBean;
import pl..entity.Customer;
/**
*
* @author
*/
public class LazyCustomerDataModel extends LazyDataModel<Customer> {
private CustomerSessionBean customerBean;
private List<Customer> datasource;
public LazyCustomerDataModel(CustomerSessionBean customerBean) {
this.customerBean = customerBean;
}
@Override
public void setRowIndex(int rowIndex) {
/*
* The following is in ancestor (LazyDataModel):
* this.rowIndex = rowIndex == -1 ? rowIndex : (rowIndex % pageSize);
*/
if (rowIndex == -1 || getPageSize() == 0) {
super.setRowIndex(-1);
} else {
super.setRowIndex(rowIndex % getPageSize());
}
}
@Override
public Customer getRowData(String rowKey) {
for (Customer customer : datasource) {
if (customer.getName().equals(rowKey)) {
return customer;
}
}
return null;
}
@Override
public Object getRowKey(Customer customer) {
return customer.getName();
}
@Override
public List<Customer> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
this.datasource = customerBean.getAllCustomers(first, pageSize);
List<Customer> data = new ArrayList<>();
//filter
for (Customer customer : 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(customer.getClass().getField(filterProperty).get(customer));
if (filterValue == null || fieldValue.startsWith(filterValue)) {
match = true;
} else {
match = false;
break;
}
} catch (Exception e) {
match = false;
}
}
if (match) {
data.add(customer);
}
}
//sort
if (sortField != null) {
Collections.sort(data, new CustomerLazySorter(sortField, sortOrder));
}
//rowCount
int dataSize = data.size();
this.setRowCount(dataSize);
//paginate
if (dataSize > pageSize) {
try {
return data.subList(first, first + pageSize);
} catch (IndexOutOfBoundsException e) {
return data.subList(first, first + (dataSize % pageSize));
}
} else {
return data;
}
}
}
- Ok, ich habe es getan: setRowCount(int size) Methode aufgerufen werden muss auf LazyCustomerDataModel Objekt (außerhalb der load () - Methode)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vor demselben Problem mit lazy loading, entnehmen Sie bitte dieser Link
fand ich, dass die Gesamtzahl der für die Liste die Größe, die Sie gesetzt haben, die erste Zeit.
bevor
schreiben
und von customerBean.getCustomersCount() ermittelt die Gesamtzahl für die Anzahl der Datensätze in der Datenbank für den Kunden.
Sollten Sie mit
@SessionScoped
statt@RequestScoped
@SessionScoped
für alle seineBeans
. Nette Idee!@SessionScoped
ist nicht korrekt.@ViewScoped
korrekt ist. Siehe auch stackoverflow.com/q/7031885