LazyDataModel con la paginación, haga clic en siguiente o última página no tiene ningún efecto

Tengo un código que me muestra la tabla con 10 filas, clasificación funciona perfectamente, pero tengo un problema cuando hago clic en el siguiente o última página – nada ha pasado. Filas por página también no funciona:( que tal vez mi JFS bean debe ser @ManagedBean en lugar de @Nombre, o tal vez alcance es erróneos?

Estoy usando: netbeans 7.3.1 (glassFish 4 incrustadas) + 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, lo he hecho: setRowCount(int size) método debe ser invocada en LazyCustomerDataModel objeto de (fuera del método load ())

OriginalEl autor Grampi | 2013-10-20

2 Kommentare

  1. 1

    Yo también enfrentan el mismo problema con la carga diferida, por favor consulte en este Enlace

    he encontrado que el recuento total de tamaño de la lista se han establecido primera vez.

    antes de

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

    escribir

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

    y de customerBean.getCustomersCount() obtener el recuento total de número de registros en la base de datos para el cliente.

    OriginalEl autor Pushkar

  2. -3

    Se debe utilizar @SessionScoped en lugar de @RequestScoped

    Sí, se debe utilizar @SessionScoped para todos sus Beans. Buena idea!
    @SessionScoped no es correcto. @ViewScoped es correcta. Véase también stackoverflow.com/q/7031885

    OriginalEl autor user2198565

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea