【问题标题】:primefaces LazyDataModel and sort does not work properlyprimefaces LazyDataModel 和排序无法正常工作
【发布时间】:2015-12-26 22:34:22
【问题描述】:

我正在尝试通过排序在我的应用程序中实现延迟加载,但在排序和分页器方面几乎没有问题。 SortBy 确实像 Paginator single 一样工作,但是当我单击 page > 0 的第一列上的排序时,LazyDataModel#load 被调用,“first”参数 = 0! 然后不是对第 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

【问题讨论】:

    标签: sorting jsf-2 primefaces


    【解决方案1】:

    您似乎希望它只对您所在的页面进行排序。这不是它的工作方式。它可以完美地工作,并且符合(几乎)每个人(除了你之外的每个人)的设计和预期。它对所有可能的结果集进行排序。第 0 页上的所有项目现在很可能会分布在其他几个页面上。因此,停留在新填充的第 1 页上完全没有任何意义。

    您描述的行为可以在 iirc 的展示中看到

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 2014-03-23
      • 2013-02-24
      • 2020-12-14
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2018-07-18
      相关资源
      最近更新 更多