В последнее время компонент таблицы ADF Faces больше не считается классным с точки зрения пользовательского интерфейса. Предполагается, что представление « Список» сегодня отлично подходит для отображения коллекций данных. Это не значит, что мы не должны использовать af: table вообще. В некоторых случаях (довольно часто :)) таблица гораздо более удобна, чем представление списка. Тем не менее, компонент представления списка выглядит действительно хорошо, он хорошо сочетается с современной тенденцией пользовательского интерфейса и определенно заслуживает широкого использования в приложениях ADF.
Одним из наиболее распространенных вариантов использования, связанных со сбором данных, является отображение основных данных. В этом посте я собираюсь показать, что мы можем сделать с помощью списка .
Компонент List View предоставляет готовые функциональные возможности для отображения иерархических данных с использованием фасета groupHeaderStamp .
Допустим, в приложении определена иерархия Departments-Employees:
Если мы перетащим подробный набор сотрудников на страницу и выберем представление списка ADF в качестве необходимого компонента, мастер позволит нам включить заголовок группы, содержащий атрибуты из родительской коллекции:
В результате представление списка на странице будет содержать фасет groupHeaderStamp с атрибутами Department:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<af:listView value= "#{bindings.Departments.treeModel}" var= "item" ... fetchSize= "#{bindings.Departments.rangeSize}" id= "lv1" > <af:listItem id= "li1" > <af:panelGridLayout id= "pgl2" > <af:gridRow marginTop= "5px" height= "auto" marginBottom= "5px" id= "gr1" > <af:gridCell marginStart= "5px" width= "34%" id= "gc1" > <af:outputFormatted value= "#{item.bindings.EmployeeId.inputValue}" id= "of1" /> </af:gridCell> ... </af:panelGridLayout> </af:listItem> <f:facet name= "groupHeaderStamp" > <af:listItem id= "li2" > <af:outputFormatted value= "#{item.bindings.DepartmentName.inputValue}" id= "of6" /> </af:listItem> </f:facet> </af:listView> |
И это выглядит так:
Это выглядит красиво, но это не то, что мне нужно! Мое требование — реализовать что-то вроде этого:
Таким образом, каждый отдел представлен панелью с двумя вкладками: общая информация об отделе и список сотрудников. Этот вариант использования может быть легко реализован с использованием Accessors из определения узла модели дерева . Древовидная модель для нашего списка в файле page def выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<tree IterBinding= "DepartmentsIterator" id= "Departments" > <nodeDefinition DefName= "DepartmentsDeafultVO" Name= "Departments0" > <AttrNames> <Item Value= "DepartmentId" /> <Item Value= "DepartmentName" /> </AttrNames> <Accessors> <Item Value= "Employees" /> </Accessors> </nodeDefinition> <nodeDefinition DefName= "EmployeesDeafultVO" Name= "Departments1" > <AttrNames> <Item Value= "EmployeeId" /> <Item Value= "FirstName" /> <Item Value= "LastName" /> <Item Value= "Email" /> </AttrNames> </nodeDefinition> </tree> |
Существует определитель доступа Employees, определенный в определении узла Departments0 . Он использует средство доступа к представлению « Сотрудники» для получения подробных записей для каждой строки отдела. Структура подробных записей описана в определении узла Departments1 .
Мы собираемся использовать эту модель иерархического дерева следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<af:listView value= "#{bindings.Departments.treeModel}" var= "item" ...> <af:listItem id= "li1" > <af:panelTabbed position= "above" id= "pt1" childCreation= "lazyUncached" > <af:showDetailItem id= "tab1" text= "Department" > <af:panelFormLayout id= "pfl1" inlineStyle= "height:150px;" > <af:panelLabelAndMessage label= "#{item.bindings.DepartmentId.hints.label}" id= "plam1" > <af:inputText value= "#{item.bindings.DepartmentId.inputValue}" id= "ot1" /> </af:panelLabelAndMessage> ... </af:panelFormLayout> </af:showDetailItem> <af:showDetailItem id= "sdi1" text= "Employees" > <af:listView value= "#{item.Employees}" var= "empItem" ...> <af:listItem id= "li2" > <af:panelGridLayout id= "pgl2" > <af:gridRow id= "gr1" > <af:gridCell id= "gc1" > <af:outputFormatted value= "#{empItem.bindings.EmployeeId.inputValue}" id= "of1" /> </af:gridCell> ... </af:panelGridLayout> </af:listItem> </af:listView> </af:showDetailItem> </af:panelTabbed> </af:listItem> </af:listView> |
Таким образом, каждый элемент списка содержит панель с вкладками внутри, а вкладка «Сотрудники» содержит вложенный список (фактически это может быть что угодно, например, таблицу) со ссылкой на средство доступа « Сотрудники» .
- Пример приложения для этого поста доступен здесь .
Требуется JDeveloper 12.1.3.
Это оно!
Ссылка: | Данные Master-Detail с ADF List View от нашего партнера JCG Евгения Федоренко в блоге ADF Practice . |