LazyDataModel с нумерацией страниц, нажатие на следующую или последнюю страницу не имеет никакого эффекта
У меня есть такой код, он показывает мне таблицу с 10 строками, сортировка работает отлично, но у меня есть проблема, когда я нажимаю на следующую или последнюю страницу - ничего не произошло. Количество строк на странице также не работает:(Возможно, мой компонент JFS должен быть @ManagedBean вместо @Named, или, возможно, область действия неверна?
Я использую: 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;
}
}
}
2 ответа
Я также столкнулся с той же проблемой с отложенной загрузкой, пожалуйста, обратитесь по этой ссылке
я обнаружил, что общее количество для размера списка вы установили в первый раз.
до
this.datasource = customerBean.getAllCustomers(first, pageSize);
записывать
if(getRowCount()<=0){
setRowCount(customerBean.getCustomersCount());
}
и из customerBean.getCustomersCount() получить общее количество для количества записей в базе данных для клиента.