primefaces LazyDataModel和sort无法正常工作

时间:2015-09-29 12:30:44

标签: sorting jsf-2 primefaces

我正在尝试使用排序实现延迟加载到我的应用程序中,但是在排序和分页器方面几乎没有问题。 SortBy确实像Paginator单一一样工作,但当我点击第一列上的排序时,页面> 0,使用“first”参数= 0调用LazyDataModel #load! 然后,而不是排序页面1的数据返回第0页

这是我的托管bean类代码:

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

}

玩家类代码:

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>

扩展LazyDataModel的PlayerLazyList类代码

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 个答案:

答案 0 :(得分:1)

您似乎期望它只对您所在的页面进行排序。这不是它的工作原理。它完美地工作,并且按照(几乎)每个人(除了你之外的所有人)的设计和预期。它对完整可能的结果集进行排序。第0页上的所有项目现在很可能会分布在其他几个页面上。所以坚持新推出的第1页完全没有任何意义。

您所描述的行为可以在展示给iirc

中看到