Как динамически добавлять заголовки списков и списки ячеек в ZK
Я совершенно новый в ZK. Мне нужно создать N списочных заголовков и N списочных ячеек в моем файле zul. Но я не знаю, как это сделать с моего контроллера Java, и я не использую MVVM.
Проблема будет что-то вроде:
@Wire
private Window idWindow;
private Listheader header;
private Listcell item1;
@Override
public void onCreate(Event event) {
header.setLabel("laaaa");// It would set just one header but I can have many (N headers) and same for items
}
<zk>
<window id="idWindow" title="nameWindow" apply="controller.java" border="normal" closable="true" sizable="true" maximizable="true" maximized="true" height="85%" width="150%" style="overflow:auto;">
<!-- CONTINUES -->
<listbox id="mainList" hflex="1" vflex="1">
<listhead>
<listheader id="header" label="A" />
<listheader id="header1" label="B" />
<listheader id="header2" label="C" />
....
<listheader id="headerN" label="N" />
</listhead>
<listitem>
<listcell id="item1" label="A"/>
<listcell id="item2" label="B"/>
<listcell id="item3" label="C"/>
....
<listcell id="itemN" label="D"/>
</listitem>
</listbox>
<!-- CONTINUES -->
</window>
</zk>
1 ответ
Вы можете оставить listhead
пустой в зул, подключите его к контроллеру и создайте listheaders
там. Важный шаг - спросить listbox
для его listhead
и добавить listheaders
к этому. Для клеток, дайте listbox
средство рендеринга, которое создает их для каждого элемента, если вы используете модель для предоставления данных вашего списка.
Ваш зул будет намного короче
<zk>
<window ... >
<listbox id="mainList" hflex="1" vflex="1">
<listhead />
</listbox>
</window>
</zk>
Затем в вашем контроллере вы создаете заголовок в doAfterCompose
и прикрепить рендер:
@Wire
private Listbox mainList;
@Override // This method should be specified by a composer super class
public void doAfterCompose(Component comp)throws Exception
{
super.doAfterCompose(comp);
mainList.setModel(someModelWithYourData);
// create listheaders (manually/in for-loop/based on data...)
Listhead head = mainList.getListhead();
head.appendChild(new Listheader("A"));
...
// attach renderer
mainList.setItemRenderer(new ListitemRenderer<Object>() // use proper data type instead of Object
{
@Override
public void render(Listitem item, Object data, int index)
throws Exception
{
item.appendChild(new Listcell("a"));
...
}
});
}
На сайтах разработчиков zk также есть пример: https://www.zkoss.org/wiki/ZK_Developer%27s_Reference/MVC/View/Renderer/Listbox_Renderer
Если вы не можете использовать модель, вы также можете добавить listitems
в zul или в контроллере, а затем создайте listcells:
for (Component child : mainList.getChildren())
{
if (child instanceof Listitem)
{
Listitem item = (Listitem) child;
// do the same as in the renderer
}
}