【问题标题】:JSF repeat for row grouping or groupRowJSF 重复行分组或 groupRow
【发布时间】:2018-04-15 03:51:42
【问题描述】:

我对 JSF 不太了解,我已经搜索过但在网上找不到类似的答案,请我需要帮助。我在下面有一组可以增长的示例表,不确定每辆车有多少行。

...................................................
| ID         | Car        | Year       | Colour   |
|.................................................|
| 37efcc3e   | Audi       | 1994       | Green    |
| 2aacdbd4   | Audi       | 2009       | Yellow   |
| 5dd57389   | BMW        | 1989       | Green    |
| 94f32d8a   | BMW        | 1978       | Orange   |
| d03b3af1   | BMW        | 2001       | Green    |
| 7ca88a0b   | Ford       | 1964       | Silver   |

我想在下面使用 div 来实现这一点

Audi
1994   Green     37efcc3e
2009   Yellow    2aacdbd4

BMW    
1989   Green     5dd57389
1978   Orange    94f32d8a
2001   Green     d03b3af1

Ford
1964   Silver    7ca88a0b

我如何使用 JSF 或 Primefaces repeat 而不是 dataTable 来实现这一点。
用普通的java

List<Product> productList;
for (Product product1 : productList) {
  for (Product product2 : productList) {
    if(product1.getCar().equals(product2.getCar())) {//check if car changes

    }
  }
}
Or can use set
Set<Product> set = new HashSet<Product>(productList);
if(set.size() < list.size()){//check if car changes

}

Primefaces 有行分组或用表格分组行,我只是想知道如何通过重复来做到这一点

【问题讨论】:

  • 尝试在纯 java 中执行此操作,并将两个循环打印到控制台。然后你也有你重复的“解决方案”
  • @Kukeltje 在纯 Java 中,当列表来自一个表并且汽车列值未知时,我如何使用两个循环来做到这一点?就像我说的 JSF 新手,我需要解决这个问题。
  • 如前所述,如果您无法在纯 java 中实现这一点,那么您的基本问题与 jsf 无关。您甚至可以在一个循环中完成。基本编程...所以概括您的问题并在 Stackoverflow 上搜索您几乎制定的问题的答案...
  • @Kukeltje 对我放心,我还不如你还在学习。用纯 java 循环它会在每一行重复显示汽车品牌,然后显示带有年份、颜色和 id 值的记录。我的情况是,如果一个汽车品牌(例如奥迪)有 100 条记录,我怎么能只在第一行显示汽车的名称,然后显示具有其他值的汽车品牌的 100 条记录。
  • 是的,我完全 1000% 理解您的问题,我可以提供一个可行的解决方案(现在提供帮助),但这样我可以帮助您学习思考不同的方式(现在和未来的帮助)您也可以(应该)尝试在纯 java 中实现这一点。考虑有条件地将东西打印到控制台......然后考虑条件(第一次和每次“汽车”发生变化)。

标签: jsf primefaces uirepeat


【解决方案1】:

在 JSF 中执行此操作与在纯 Java 中执行此操作并没有什么不同

伪代码 java

假设一个排序列表(如在您的表中但随后排序),因此无需额外重写支持模型

for(int i=0; i<cars.size();i++) {
    if (i==0 || !cars[i].getBrand().equals(car[i-1].getBrand())) {
       System.out.println(cars[i].getBrand());
    }
    System.out.println(cars[i].type + "\t" +cars[i].color + "\t" + cars[i].year);
}

在 JSF 中(也是“伪代码”,未测试)

<table>
  <ui:repeat var="car" value="#{bean.cars}" varStatus="myVarStatus">

    <ui:fragment  rendered="#{myVarStatus.index == 0 || !bean.cars.get(myVarStatus.index).brand.equals(bean.cars.get(myVarStatus.index -1).brand}">
        <tr><td colspan="3"><h:outputText value="#{car.brand}"></td></tr>
    </ui:fragment>

    <tr>
       <td>#{car.type}</td>
       <td>#{car.color}</td>
       <td>#{car.year}</td>
    </tr>

  </ui:repeat>
</table>

【讨论】:

  • 我使用的是集合而不是数组,因此在指定位置返回一个元素将是 cars.get(i).getBrand()。我已经测试了普通的 java,当我从你的 if 条件中删除 int i = 0 时出现语法错误,我得到 java.lang.ArrayIndexOutOfBoundsException:-1。而且我不明白您的 if 条件,您再次声明 int i = 0 和 car[i-1] ?我也测试了jsf代码没有错误但是品牌重复了。
  • int i=0 在条件是一个错字更正它。你能明白为什么它需要是什么吗?关于 JSF 代码,您可能需要改进条件,我只是希望您明白这一点。如果你不……好吧……
  • 谢谢你,我真的很感激,你让我思考,它有效。我可以在生产中使用它吗?还是哈希集和哈希表更可取?
  • 不客气......不,这对生产来说很好。无需先创建一个不同的模型(除非这对您来说更容易)。而且您可以并且可能会接受答案(甚至“赞成”它;-))
猜你喜欢
  • 2014-06-28
  • 1970-01-01
  • 2012-04-11
  • 2017-03-22
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多