Как динамически добавлять заголовки списков и списки ячеек в 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
    }
}
Другие вопросы по тегам