Визуализация макрокомпонентного списка 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/