p: dataTable-Auswahlen gehen nach dem Paginieren eines LazyDataModel verloren

Mein Problem ist, dass, nachdem ich einige Elemente auf der ersten Seite ausgewählt habe, meine anfänglichen Auswahlen nicht angezeigt werden, wenn ich auf eine andere Seite paginiere und zurückkomme. Ich habe versucht, das umzusetzenSelectableDataModel sowie mit derrowKey Attribut, aber das Problem bleibt bestehen.

Das ist meine Testbohne:

@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
}

Dies ist meine Testseite:

<?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>

Ich wäre Ihnen sehr dankbar, wenn Sie mir zeigen könnten, was ich hier falsch gemacht habe.

AKTUALISIEREN: Nachdem ich mehr hinzugefügt habeSystem.out.println("TEST") Zu dem obigen Code habe ich die folgenden Dinge beobachtet:

Auf der Konsole, jedes Mal, wenn ich paginiere,TEST 1: getRowData wird immer vorher gedrucktTEST 2: load. Infolgedessen glaube ich an die Methode#LazyDataModel.getWrappedData() kann Daten von der alten Seite zurückgeben. Zuerst dachte ich, dass das Ziel dieser Methode darin bestand, die ausgewählten Zeilen abzurufen, die in der Tabelle hervorgehoben werden sollen. Wird diese Methode jedoch vorher aufgerufenload, gibt es keine Möglichkeit, die Arbeit richtig zu machen?Nachdem ich die ersten 2 Elemente auf der ersten Seite auf der Konsole ausgewählt hatte, sah ichTEST 3: chosenItems's size: 2. Wenn ich zur 2. Seite und dann zurück zur 1. Seite wechsle, geht die Auswahl wie erwähnt verloren. Wenn ich jedoch weiterhin ein anderes Element auf der Konsole auswählte, sah ichTEST 3: chosenItems's size: 3. Offensichtlich ist diechosenItems Die Liste enthält weiterhin meine alte Auswahl, sie wird jedoch nicht auf dem Tisch gerendert.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage