2

I implemented lazy loading at prime faces data table. It is working fine but when page is changed the selection is cleared. How to retain the selection at some other pages when page is changed and return back to the page. I found one related question here.

This answer helped me to keep the selected objects but failed to keep check boxes at table when come back to the page.

using Prime Faces version 6.2

4
  • I think there has been some work in this area since PF 6.2 that already resolves this issue. This sounds familiar and I feel like it is fixed in a later version. Commented Jul 9, 2021 at 16:35
  • But I can't change the prime faces version so I need some work around at bean to resolve this. Thanks for help Commented Jul 9, 2021 at 18:03
  • See this thread: github.com/primefaces/primefaces/issues/1833 it has some solutions posted in there. Commented Jul 9, 2021 at 19:03
  • Not got any helpful answer. Commented Jul 10, 2021 at 3:42

2 Answers 2

1

Since OP doesn't want to upgrade above 6.2 the solution is a workaround listed here: https://forum.primefaces.org/viewtopic.php?f=3&t=47224

Add an AJAX toggleSelect event

<p:ajax event="toggleSelect" 
global="false" 
immediate="true"  
update=":usersManagerForm:usersTable:usersActions" 
listener="#{usersManagerBean.onToggleSelect}" />

And backing bean method:

public void onToggleSelect(ToggleSelectEvent event) {
        List<Compte> comptesListOfCurrentPage = (List<Compte>) compteLazyDataModel.getWrappedData();
        if(event.isSelected()) {
            selectedComptesList.addAll(comptesListOfCurrentPage);
        } else {
            selectedComptesList.removeAll(comptesListOfCurrentPage);
        }
    }
Sign up to request clarification or add additional context in comments.

1 Comment

This event triggers only for toggle not for single row selection. thanks.
1

I got the solution with the help of 2 answers

  1. From this
  2. thanks to melloware above anser

.xhtml

<p:dataTable selection="#{myBean.selectedRows}" ... >
   <p:ajax event="rowSelectCheckbox" process="@this" listener="#{myBean.onSelectRow}" />
   <p:ajax event="rowUnselectCheckbox" process="@this" listener="#{myBean.onUnselectRow}" />
<p:ajax event="page" process="@this" listener="#{myBean.onPagination}" />
<p:ajax event="toggleSelect" process="@this" listener="#{myBean.onToggle}" />
   <p:column selectionMode="multiple" ... />
    ...
 </p:dataTable>

.java

    private List<MyRowClass> selectedRows;
    private List<MyRowClass> selectedRowsSaved;

    ...

    public void onSelectRow(SelectEvent event){
        selectedRowsSaved.add((MyRowClass) event.getObject());
    }

    public void onUnselectRow(UnselectEvent event){
        selectedRowsSaved.remove((MyRowClass) event.getObject());
    }
    
    public void onToggle(ToggleSelectEvent event){
    List<Object> completeListOfCurrentPage = (List<Object>) compteLazyDataModel.getWrappedData();
        if(event.isSelected()) {
            selectedRowsSaved.addAll(comptesListOfCurrentPage);
        } else {
            selectedRowsSaved.removeAll(comptesListOfCurrentPage);
        }
    }

    public void onPagination(){
        if(selectedRowsSaved!=null && selectedRowsSaved.isEmpty()}{
            selectedRows.addAll(selectedRowsSaved);
        }
    }
    public List<MyRowClass> getSelectedRows(){
        return selectedRowsSaved;
    }

    public void setSelectedRows(List<MyRowClass> selectedRows){
        this.selectedRows = selectedRows;
    }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.