La solución existente no me parece una mala. RowIndex debería funcionar en tablas anidadas siempre que haga referencia al modelo de la tabla anidada. modelo
<h:dataTable border="1" value="#{nestedDataModel}" var="nested">
<h:column>
<h:dataTable border="1" value="#{nested}" var="item">
<h:column>
<h:outputText value="#{nested.rowIndex}" />
</h:column>
<h:column>
<h:outputText value="#{item}" />
</h:column>
</h:dataTable>
</h:column>
</h:dataTable>
muestra:
public class NestedDataModel extends DataModel implements Serializable {
private List<List<String>> nestedDataModel = populateModel();
private int index;
private List<List<String>> populateModel() {
List<List<String>> list = new ArrayList<List<String>>();
for(int x=0; x<3; x++) {
List<String> nestedTableData = new ArrayList<String>();
for(int y=0; y<3; y++) {
nestedTableData.add("Foo x="+x+" y="+y);
}
list.add(nestedTableData);
}
return list;
}
@Override
public int getRowCount() {
return nestedDataModel.size();
}
@Override
public Object getRowData() {
List<String> list = nestedDataModel.get(index);
return new ListDataModel(list);
}
@Override
public int getRowIndex() {
return index;
}
@Override
public Object getWrappedData() {
return nestedDataModel;
}
@Override
public boolean isRowAvailable() {
return index >= 0 && index < nestedDataModel.size();
}
@Override
public void setRowIndex(int arg0) {
index = arg0;
}
@Override
public void setWrappedData(Object arg0) {
throw new UnsupportedOperationException();
}
}
tablas de datos de la jerarquización general, debe evitarse - si usted no tiene cuidado (por ejemplo, hacer que los niños de una forma), esto puede conducir a un O (n^2) pasar sobre la mesa los niños para cada fase del ciclo de vida en un envío (y hay 6 fases en el ciclo de vida).
Para algo que es externo al modelo, se puede utilizar un simple contador en un bean gestionado:
public class RowCounter implements Serializable {
private transient int row = 0;
public int getRow() {
return ++row;
}
}
Config:
<managed-bean>
<managed-bean-name>rowCounter</managed-bean-name>
<managed-bean-class>tablerows.RowCounter</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
Vista:
<f:view>
<h:dataTable border="1" value="#{tableDataBean.tableDataModel}"
var="rowBean">
<h:column>
<h:outputText value="#{rowCounter.row}" />
</h:column>
<h:column>
<h:outputText value="#{rowBean}" />
</h:column>
</h:dataTable>
</f:view>
Esto funciona porque el frijol i s request-scope y vinculado a un control de solo lectura fuera de un formulario. No funcionaría en una tabla de datos anidada a menos que quisiera que el contador de filas sea global para la vista. Pero entonces, no estoy convencido de que el índice de fila deba ser una función de la vista.
Para una tabla de datos anidada, sería mejor que proporcionara el índice de fila del bean de fila. Te da más control si decides hacer cosas como paginación sobre conjuntos de datos también.
Ver [http: // stackoverflow.com/questions/14633008/jsf-2-datatable-row-index-without-datamodel]. Esta respuesta es más nueva que las de abajo, también es corta y dulce. – fr13d