Визуализация макрокомпонентного списка Zk

Здравствуйте, у меня есть такой макрокомпонент.

<listbox id="results">
   <listitem id='listitem' self="@{each=d}">
        <listcell label='@{d.column1}'/>
        <listcell label='@{d.column2}'/>
        <listcell label='@{d.column3}'/>  
        <listcell label='@{d.column4}'/>
   </listitem>
</listbox>

Я устанавливаю модель набора, используя BindingListModelList как обычный список.

Окно списка представляет собой рендер, но содержит только 1 столбец и показывает метод toString адаптера.

final List<Students>students = ...........
results.setModel(new BindingListModelList<>(students,false));

А затем покажите метод toString() класса Student.

Я должен попробовать этот синтаксис

<listitem id='listitem' self="@{each=${arg.includer.adapters}}">
    <listcell label='${arg.includer.adapters[self.columIndex].column1}'/>
    <listcell label='${arg.includer.adapters[self.columIndex].column2}'/>
    <listcell label='${arg.includer.adapters[self.columIndex].column3}'/>
    <listcell label='${arg.includer.adapters[self.columIndex].column4}'/>
</listitem>

А класс HTMLMacroComponent имеет метод getAdapters, который возвращает данные для отображения.

public class StudentDetail extends HtmlMacroComponent{
public List<Students>getAdapters(){
    return adapters;
}
}

Но я не мог заставить это работать!!! Видит, что нет itemRender, как при создании списка, используя новый Listbox(), и устанавливает не itemRender.

Помогите мне, пожалуйста.

2 ответа

Решение

Насколько я вижу, проблема в том, что ваш zul просто добавляет элемент списка (т.е. 1, и только ровно 1 элемент списка), а не шаблон, который сообщает списку, как визуализировать вашу модель. (По крайней мере из ваших фрагментов кода я предполагаю, что вы хотите использовать шаблон. Дайте мне знать, если я вас неправильно понял.)

Ваш код выполняет следующие действия: анализирует zul для создания компонентов, которые создают 1 элемент списка, который вы там определили. Затем он устанавливает модель, которая удаляет все существующие элементы списка (т. Е. Созданную в zul) и отображает значения модели с помощью itemrenderer или предоставленного шаблона. Так как вы не указали ни одного, по умолчанию просто отображается один столбец с toString(),

Попробуйте это так:

<listbox>
    <template name="model">
        <listitem>
            <listcell label="${each.column1}"/>
            <listcell label="${each.column2}"/>
            <listcell label="${each.column3}"/>  
            <listcell label="${each.column4}"/>
       </listitem>
    </template>
</listbox>

Вы можете прочитать о шаблонах здесь: https://www.zkoss.org/wiki/ZK_Developer%27s_Reference/MVC/View/Template/Listbox_Template

В качестве альтернативы вы можете использовать Listbox.setItemRenderer() использовать рендерер на основе Java вместо шаблона.

Обратите внимание, что вы перепутали некоторые вещи из zk:

  • @ только для привязки данных. Если вы хотите использовать zk Expression Language (материал с фигурными скобками), он начинается с $
  • self не является хорошим именем переменной в zul, так как оно ссылается на сам компонент уже тогда, когда вы хотите сослаться на него в слушателях в zul.
  • Предоставление идентификаторов списочных элементов имеет смысл, только если они получают разные идентификаторы, и вы знаете эти идентификаторы. Обычно при использовании модели (то есть динамических данных) идентификаторы вам не помогут.

Тот же вопрос был задан и получен ответ на форуме ZK:

http://forum.zkoss.org/question/105543/zk-653-listbox-macrocomponent/

Другие вопросы по тегам