Anton
Anton

Reputation: 1419

Pagination is not working on Primefaces dataTable with filter (first time only)

I have an application (Websphere 8.5, Java EE6, PrimeFaces 5.3 on JSF 2+).

When I open this page in browser (tried Chrome and FF) and first try to navigate (there are 2 pages, 22 ranges in my example) - I get empty table (header says 16-22 out of 22 but the table is empty), and is still empty whenever I go back to first page - here how it looks like: enter image description here

In case I filter table first - pagination works great.

I've seen similar behavior with another components - eg commandButton on other table, but this is minimal reproduction of the issue. If I remove the filtering - everything works fine.

I guess I have an error somewhere but can't find it.

Views contains following form:

    <h:form id="form">
<p:dataTable id="mainTable" value="#{rangeManagementBean.allRanges}"
            var="range1" filteredValue="#{rangeManagementBean.filteredRanges}"
            paginator="true"
            paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
            rows="15">

            <p:column headerText="Site" sortBy="#{range1.siteName}"
                filterBy="#{range1.siteName}" filterMatchMode="contains">
                <h:outputText value="#{range1.siteName}">
                </h:outputText>
            </p:column>
        </p:dataTable>
</h:form>

while backing bean code is:

@ViewScoped
@ManagedBean(name = "rangeManagementBean")
public class RangeManagementBean {

private ArrayList<RangeDto> allRanges;
private ArrayList<RangeDto> filteredRanges;
@EJB
private RangeProvider rangeProvider;

@PostConstruct
public void init(){
    setAllRanges(new ArrayList<RangeDto>(rangeProvider.getAllRangesDto()));
    setFilteredRanges(new ArrayList<RangeDto>());
}

public ArrayList<RangeDto> getFilteredRanges() {
    return filteredRanges;
}

public void setFilteredRanges(ArrayList<RangeDto> filteredRanges) {
    this.filteredRanges = filteredRanges;
}

public ArrayList<RangeDto> getAllRanges() {
    return allRanges;
}

public void setAllRanges(ArrayList<RangeDto> allRanges) {
    this.allRanges = allRanges;
}
}

RangeDto is POJO with String getters/setters.

Upvotes: 2

Views: 4202

Answers (1)

Ga&#235;l J
Ga&#235;l J

Reputation: 15050

It's due to the filteredValue list (i.e. #{rangeManagementBean.filteredRanges}) being empty at first:

setFilteredRanges(new ArrayList<RangeDto>());

You have to initalize it with all values:

setFilteredRanges(getAllRanges());

Upvotes: 3

Related Questions