p: daneTabele tabeli są tracone po paginacji LazyDataModel

Moim problemem jest to, że po wybraniu kilku elementów na pierwszej stronie, jeśli stronię na innej stronie i powrócę, moje początkowe wybory nie zostaną wyświetlone. Próbowałem zaimplementowaćSelectableDataModel jak również za pomocąrowKey atrybut, ale problem nadal występuje.

To jest mój testowy komponent:

@ManagedBean
@ViewScoped
public class MrBean {
    private List<Item> chosenItems;
    private LazyDataModel lazyModel;

    @PostConstruct
    public void prepareTest() {
        this.lazyModel = new LazyItemDataModel();
    }

    public void countItems() {
        System.out.println("TEST 3: chosenItems's size: " + chosenItems.size());
    }

    private class LazyItemDataModel extends LazyDataModel<Item> implements SelectableDataModel<Item> {
        @Override
        public Item getRowData(String rowKey) {
            System.out.println("TEST 1: getRowData");
            Iterator<Item> iter = ((List<Item>) this.getWrappedData()).iterator();
            while (iter.hasNext()) {
                Item item = iter.next();
                if (item.getId().equals(rowKey)) {
                    return item;
                }
            }

            return null;
        }

        @Override
        public Object getRowKey(Item item) {
            return item.getId();
        }

        @Override
        public List<Item> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
            System.out.println("TEST 2: load");
            // Code to retrieve items from database
        }
    }

    // Getters and Setters
}

To jest moja strona testowa:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Test page</title>
    </h:head>
    <h:body>
        <h:form>
            <p:dataTable id="itemTable" var="item" value="#{mrBean.items}" rows="5" 
                         paginator="true" selection="#{mrBean.chosenItems}" lazy="true" >

                <p:ajax event="rowSelectCheckbox" listener="mrBean.countItems" />                    

                <p:column selectionMode="multiple" />

                <p:column headerText="ID">
                    <h:outputText value="#{item.id}" /> 
                </p:column>

                <p:column headerText="Name">
                    <h:outputText value="#{item.name}" /> 
                </p:column>

            </p:dataTable>
        </h:form>
    </h:body>
</html>

Byłbym bardzo wdzięczny, gdybyś mógł mi pokazać, co zrobiłem źle tutaj.

AKTUALIZACJA: Po tym, jak dodałem więcejSystem.out.println("TEST") do powyższego kodu zaobserwowałem następujące rzeczy:

Na konsoli, za każdym razem, gdy paginuję,TEST 1: getRowData jest zawsze drukowane wcześniejTEST 2: load. W konsekwencji wierzę w tę metodę#LazyDataModel.getWrappedData() może zwrócić dane ze starej strony. Na początku myślałem, że celem tej metody było odzyskanie wybranych wierszy, aby wyróżnić je na stole. Jeśli jednak ta metoda zostanie wcześniej wywołanaload, nie ma mowy, żeby to zrobić dobrze?Po wybraniu pierwszych 2 pozycji na pierwszej stronie na konsoli widziałemTEST 3: chosenItems's size: 2. Jeśli podzielę stronę na drugą stronę, a następnie z powrotem na pierwszą stronę, selekcje zostaną utracone, jak wspomniano. Jednak, gdybym nadal wybierał inny element na konsoli, widziałemTEST 3: chosenItems's size: 3. OczywiściechosenItems lista nadal zachowywała moje stare wybory, ale nie są one renderowane w tabeli.

questionAnswers(5)

yourAnswerToTheQuestion