views:

854

answers:

1

having a myfaces datatable, is is possible to have 2 rows for each record? my simple one-row table looks like the following:

<h:dataTable id="somelist" value="#{MyBean.somelist}" var="item">
    <h:column>
        <f:facet name="header">
            <h:outputText value="ID"/>
        </f:facet>
        <h:outputText value="#{item.id}"/>
    </h:column>
</h:dataTable>
+1  A: 

Yes, in this case. You can control the value bound to the outputText via a custom DataModel.

public class TwoRowModel extends DataModel {

    private List<Pair> values = initData();
    private int index = -1;

    private List<Pair> initData() {
     List<Pair> list = new ArrayList<Pair>();
     for (int i = 0; i < 5; i++) {
      Pair pair = new Pair();
      pair.key = "Key " + i;
      pair.value = "Value " + i;
      list.add(pair);
     }
     return list;
    }

    @Override
    public int getRowCount() {
     return values.size() * 2;
    }

    @Override
    public Object getRowData() {
     Pair pair = values.get(index / 2);
     if (index % 2 == 0) {
      return pair.key;
     } else {
      return pair.value;
     }
    }

    @Override
    public int getRowIndex() {
     return index;
    }

    @Override
    public Object getWrappedData() {
     throw new UnsupportedOperationException("Demo code");
    }

    @Override
    public boolean isRowAvailable() {
     int realIndex = index / 2;
     if (realIndex < 0) {
      return false;
     }
     if (realIndex >= values.size()) {
      return false;
     }
     return true;
    }

    @Override
    public void setRowIndex(int idx) {
     this.index = idx;
    }

    @Override
    public void setWrappedData(Object value) {
     throw new UnsupportedOperationException("Demo code");
    }

    class Pair {
     public String key;
     public String value;
    }

}

In this demo code, the value returned is just the one to be displayed:

 <h:dataTable id="somelist" value="#{twoRowModel}" var="item">
  <h:column>
   <f:facet name="header">
    <h:outputText value="ID" />
   </f:facet>
   <h:outputText value="#{item}" />
  </h:column>
 </h:dataTable>
McDowell
this looks good, i'll try this out.
Andreas Petersson