1
votes

I'm attempting to implement lazy loading into my application with sorting, but am having little issues with sorting and paginator. SortBy does work so like Paginator single but when i click on sort on first column with page > 0, the LazyDataModel#load is called with "first" parameter = 0! Then instead of sorting data of page 1 return on page 0

Here is my managed bean class code:

@ViewScoped
@ManagedBean
public class PlayerMB implements Serializable {

private static final long serialVersionUID = 1L;
private LazyDataModel<Player> players = null;
private int sizePlayer;



private Player player;

public LazyDataModel<Player> getAllPlayers() {
    if (players == null) {
        players = new PlayerLazyList();
    }
    setSizePlayer(players.getRowCount());

    return players;
}

public Player getPlayer() {
    if(player == null){
        player = new Player();
    }

    return player;
}

public void setPlayer(Player player) {
    this.player = player;
}
public int getSizePlayer()
{
    return sizePlayer;
}

public void setSizePlayer(int sizePlayer) {
    this.sizePlayer = sizePlayer;
}

}

Player class code:

public class Player implements Serializable{

private static final long serialVersionUID = 1L;

private int id;

private String name;
private int age;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

@Override
public int hashCode() {
    return getId();
}

@Override
public boolean equals(Object obj) {
    if(obj instanceof Player){
        Player player = (Player) obj;
        return player.getId() == getId();
    }

    return false;
}

/*public int sortByModel(Object player1, Object player2)
{
    return ((Player) player1).getName().compareTo(((Player)  player2).getName());
}*/
}

dataTable.xhtml:

   <f:view>
    <h:form>
        <p:dataTable id="lazyDataTable" 
            value="#{playerMB.allPlayers}" 
            var="player" paginator="true" 
            rows="10"
            selection="#{playerMB.player}" 
            selectionMode="single"
            paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
            rowsPerPageTemplate="5,10,15" 
            style="width: 80%;margin-left: 10%;
            margin-right: 10%;"
            lazy="true">

            <f:facet name="header">List of players</f:facet>

            <p:ajax event="rowSelect" update=":playerDialogForm" oncomplete="PF('playerDetails').show();" />
            <p:ajax event="page"
                        listener="#{playerMB.casePage}"/>
            <p:column sortBy="#{player.name}" headerText="Name" > <!-- sortBy does not work with lazyDataTable  but more work occurs-->
                <h:outputText value="#{player.name}" />
            </p:column>
            <p:column sortBy="#{player.age}" headerText="Age">
                <h:outputText value="#{player.age}" />
            </p:column>

            <f:facet name="footer">tot: #{playerMB.sizePlayer}</f:facet>                
        </p:dataTable>
    </h:form>

PlayerLazyList class code who extends LazyDataModel

public class PlayerLazyList extends LazyDataModel<Player> {
//private int pagina;

@Override
public List<Player> load(int first, int pageSize, String sortField,
        SortOrder sortOrder, Map<String, Object> filters) {
    List<Player> allplayers = CreatePlayers.players; //here load all Player

    System.out.println("first =" + first + "; pagesize =" + pageSize + "; sortField = " + sortField);
    players = CreatePlayers.getPlayers(first, pageSize,allplayers.size()); //here load player from "first" for "max" element

    if (sortField != null && sortField.equals("name") && sortOrder.name().equals("ASCENDING"))
        Collections.sort(players, new NamePlayerComparatorAsc());

    if (sortField != null && sortField.equals("name") && sortOrder.name().equals("DESCENDING"))
        Collections.sort(players, new NamePlayerComparatorDesc());

    System.out.println("size dopo" + players.size());

    // set the total of players
    if(getRowCount() <= 0){
        //setRowCount(playerDAO.countPlayersTotal());
        setRowCount(allplayers.size());
    }
    // set the page dize
    setPageSize(pageSize);
    return players;
}

private static final long serialVersionUID = 1L;

private List<Player> players;

//private MyTransaction transaction;


@Override
public Object getRowKey(Player player) {
    return player.getId();
}

@Override
public Player getRowData(String playerId) {
    Integer id = Integer.valueOf(playerId);

    for (Player player : players) {
        if(id.equals(player.getId())){
            return player;
        }
    }

    return null;
}
}

Primefaces 5.2, Wildfly 8.2.0, Mojarra 2.2.8

1

1 Answers

1
votes

You seem to expect it sorts just the page you are on. That is just not how it works. It works perfectly and as designed and as expected by (almost) everybody (that is everybody but you). It sorts the full possible resultset. All items that were on page 0 will now most likely be spread over several other pages. So staying on the newly populalted page 1 totally does not make any sense.

The behaviour you describe can be seen in the showcase to iirc