primefaces datatable lazy loading yapmayı deniyorum. primefacesın showcaseinde paylaştığı kodları kullandım.

public class LazyCarDataModel extends LazyDataModel<Car> {

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>();

    //filter
    for(Car car : 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(car.getClass().getField(filterProperty).get(car));

                if(filterValue == null || fieldValue.startsWith(filterValue)) {
                    match = true;
                }
                else {
                    match = false;
                    break;
                }
            } catch(Exception e) {
                match = false;
            } 
        }

        if(match) {
            data.add(car);
        }
    }

    //sort
    if(sortField != null) {
        Collections.sort(data, new LazySorter(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;
    }
}

@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());
}

}

bean

@ManagedBean
@RequestScoped
public class TableBean implements Serializable {

private final static String[] colors;
private final static String[] manufacturers;

private LazyDataModel<Car> lazyModel;
private Car selectedCar;
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";
}

public TableBean() {
        cars = new ArrayList<Car>();
        populateRandomCars(cars, 50);
        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 populateRandomCars(List<Car> list, int size) {
    for(int i = 0 ; i < size ; i++) {
        list.add(new Car(getRandomModel(), getRandomYear(), getRandomManufacturer(), getRandomColor()));
    }
}

    private String getRandomModel() {
            return UUID.randomUUID().toString().substring(0, 8);
    }

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);
}
 }

yaşadığım sorun datatable filtrelemeyi doğru yapmıyor. şöyle ki color hanesine y harfi girdiğimde önce 4 yellow satırı sonra e harfi girdiğimde 8 yellow satırı getiriyor l harfi girdiğimde bu sayı tekrar değişiyor bunun gibi şeyler oluyor. bu diğer alanlarda da oluyor.

load metodu içinde kontroller yaptığımda sonuç kümesinin doğru döndürüldüğünü gördüm ama listelemede belirttiğim sıkıntı yaşanıyor.

soruldu: 29 Tem '12, 11:35

lazy's gravatar image

lazy
146171724
cevap kabul oranı: 0%

Bu soruya ilk cevap veren sen ol!
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×281
×97
×3

Soruldu: 29 Tem '12, 11:35

Görüntüleme: 1,177 kez

Son güncelleme: 29 Tem '12, 11:35

powered by BitNami OSQA