我正在尝试实现具有延迟加载功能的表。我想我已经从演示页面和文档中获取了所有步骤,但始终收到“未找到记录”消息。我认为我已将代码简化为最少的表达,至少应该有一条记录:
表格页面:
<h:form id="listaEmpresas">
<p:dataTable id="tablaEmpresas" value="#{empresasTableMB.lazyDataModel}" var="empresa">
<p:column>
<f:facet name="header">
<h:outputText value="#{msgs.empresa_tabla_nombre}"/>
</f:facet>
<h:outputText value="#{empresa.nombre} "/>
</p:column>
</p:dataTable>
</h:form>
LazyDataModel:
@Override
public List<Empresa> load(int first, int pageSize, String sortField, SortOrder so, Map<String, String> filters) {
List<Empresa> listaEmpresas = new ArrayList();
Empresa e = new Empresa();
e.setNombre("Company");
listaEmpresas.add(e);
this.setRowCount(1);
return listaEmpresas;
}
@Override
public void setRowIndex(int rowIndex) {
if (rowIndex == -1 || getPageSize() == 0) {
super.setRowIndex(-1);
}
else
super.setRowIndex(rowIndex % getPageSize());
}
我必须重写setRowIndex或得到异常“ java.lang.ArithmeticException:/零”。我正在使用primefaces-3.1-SNAPSHOT,jsf 2.0.3和tomcat 6.0。请帮忙。我缺少什么?
在数据表中添加lazy=true
。添加此数据表后,便可以调用您的load()
方法。
您需要添加字段private int rowCount;
然后在load(...)
方法中,将列表中记录数的值设置为此字段(rowCount
)。没有此内容,<p:dataTable ...>
将获得“找不到记录”,并且如果您未指定rows ="10"
(例如)属性,它将不会呈现行!
您还需要实现LazyDataModel#getRowKey
和LazyDataModel#getRowData
。
假设您有类似的东西:
class Empresa {
private long id;
private String nombre;
// getters and setters...
}
然后:
getRowKey
返回Empresa
对象的IDgetRowData
通过ID获取Empresa
对象class MyLazyDataModel {
// stuff you already have comes here...
public Empresa getRowData(String rowKey) {
return empresaRepository.getEmpresaById(Long.valueOf(rowKey));
}
public Object getRowKey(Empresa empresa) {
return empresa.getId();
}
}
https://code.google.com/p/primefaces/issues/detail?id=1544中对此行为进行了描述,显然,您可以通过显式调用lazyDataModel.setPageSize();
来避免此行为>
这里有相关文章:
您没有调用load方法。在素面数据表声明之前先调用load方法。