我一直在创建表,方法是在页面中添加一个ListView(将我的数据作为List< MyObject>提供),并为html文件中的每一列分配相应的ID.
但是现在我有一种情况,而不是简单的List< MyObject>我有List< Map< String,MyObject>>.我还得到一个列表,其中包含嵌套映射的所有可能键(List< String>).现在我需要创建一个表,其中Map的每个值都应该在列中,并且键的名称指向该值.
假设我有以下数据:
keys = ['a','b'] data = [ { 'a' = 1,'b' = 2 },{ 'a' = 3,'b' = 4 },{ 'a' = 5,'b' = 6}]
我想创建表:
<table> <tr> <th>a</th> <th>b</th> </tr> <tr> <td>1</td> <td>2</td> </tr> <tr> <td>3</td> <td>4</td> </tr> <tr> <td>5</td> <td>6</td> </tr> </table>
知道嵌套Map中的键的名称和数量可以改变,在wicket中实现它的最佳方法是什么?
解决方法
您可以嵌套ListView.你想要的标记看起来像这样:
<table> <tr><th wicket:id="headerlist"><span wicket:id="header"></span></th></tr> <tr wicket:id="contentlist"><td wicket:id="column"> <span wicket:id="data"></span> </td></tr> </table>
然后,您将需要三个ListView.第一个(headerlist)将填充键列表中的标题.这很简单,所以我将跳过这个例子.
第二个(内容列表)将在您的数据列表中.在populateItems方法中,您将添加第三个ListView(列),它将再次遍历键列表:
add(new ListView<Map<String,MyObject>>("contentlist",data) { protected void populateItem(ListItem<Map<String,MyObject>> item) { final Map<String,MyObject> map = item.getModelObject(); // Inner list - using item.add to add to the inner list item.add(new ListView<String>("column",keys) { protected void populateItem(ListItem<String> item) { String key = item.getModelObject(); item.add(new Label("data",map.get(key).toString())); } }); } });