LazyDataModel with pagination, clicking on next or last page has no effect

Grampi picture Grampi · Oct 20, 2013 · Viewed 12.6k times · Source

I have such a code, it shows me table with 10 rows, sorting works perfectly, but i have a problem when I click on the next or last page - nothing happend. Rows per page also doesn't work:( Maybe my JFS bean should be @ManagedBean instead of @Named, or maybe scope is incorect?

I am using: 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;
    }
}
}

Answer

Pushkar picture Pushkar · Oct 21, 2013

I also faced same issue with lazy loading, please refer this Link

i found that total count for list size you have set first time.

before

this.datasource = customerBean.getAllCustomers(first, pageSize);

write

if(getRowCount()<=0){
    setRowCount(customerBean.getCustomersCount());
}

and from customerBean.getCustomersCount() get total count for number of records in database for customer.