我正在尝试使用延迟加载来实现一个表。我想我从演示页面和文档中得到了所有步骤,但我总是得到“没有找到记录”的消息。我想我已经将代码减少到最小化表达式,至少应该有一条记录:
表格页面:
<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:/ by zero”。我正在使用primefaces-3.1-SNAPSHOT,jsf 2.0.3和tomcat 6.0。请帮忙。我错过了什么?
答案 0 :(得分:2)
在您的dataTable中添加lazy=true
。
添加此数据表后,您可以调用load()
方法。
答案 1 :(得分:1)
您需要添加字段private int rowCount;
然后在您的load(...)
方法中将列表中记录数量的设置值设置为此字段(rowCount
)。
没有这个东西<p:dataTable ...>
将获得&#34;没有找到记录&#34;如果你没有指定rows ="10"
(例如)属性,它也不会呈现行!
答案 2 :(得分:0)
您还需要实施LazyDataModel#getRowKey
和LazyDataModel#getRowData
。
假设你有类似的东西:
class Empresa {
private long id;
private String nombre;
// getters and setters...
}
然后:
getRowKey
返回Empresa
对象的ID getRowData
按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();
}
}
答案 3 :(得分:0)
https://code.google.com/p/primefaces/issues/detail?id=1544中描述了此行为,显然您可以通过明确调用lazyDataModel.setPageSize();
这里有相关的帖子:
答案 4 :(得分:0)
你没有调用load方法。首先在主面数据表声明之前调用load方法。