Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 50 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
50
Dung lượng
704,96 KB
Nội dung
571
CHAPTER
Using List Controls
IN THIS CHAPTER
Understanding list controls
Providing data to list controls
Using dynamic data providers
Controlling list item labels
Using list control events and
properties
Handling user data selections
Using custom item renderers
M
ost Flex applications are designed for the purpose of presenting
and managing data in some form. As a result, one of the most pop-
ular families of visual controls in the Flex framework includes
those known as list controls.
A list control is defined as a component that has a
dataProvider property
that enables you to populate the control with dynamic data. The data provided
to a list control can be in the form of either hierarchical or relational data, and
the type of data you want to present frequently determines which control you
use. In addition to being able to display relational or hierarchical data, list con-
trols have a common set of properties, methods, and events that enable the
user to select one or more items with mouse and keyboard gestures.
The Flex4 SDK includes both the older MX list controls such as
DataGrid,
AdvancedDataGrid, and OlapDataGrid and newer controls based on
the new Spark component architecture:
l
The List component. This component behaves by default like an
HTML
<select> control and displays data items to the user in a
list box. After you learn how to use the
List control, you have
most of the information you need to use other such controls. You
can populate controls with data, listen for events indicating that the
user has selected or started to drag data, set common styles, and so
on. It supports the Spark layout architecture, so you can display a
horizontal or tile layout instead of the default vertical list.
l
The DropDownList and ComboBox components. These compo-
nents also behave like an HTML
<select> control but use a drop-
down list instead of a static list.
l
The ButtonBar component. This component has the same
appearance and behavior as an MX
ToggleButtonBar, presenting
a set of
ToggleButton controls horizontally, but is controlled
programmatically just like other Spark list controls.
26_488959-ch19.indd 57126_488959-ch19.indd 571 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Part III: Working with Data
572
On the Web
To use the sample code for this chapter, import the chapter19.fxp project from the Web site files into any
folder on your disk.
n
In this chapter, I describe in general terms how to use all list controls. I include information on
how to populate these controls with data, how to control data presentation with custom generation
of item labels and renderers, and how to handle events indicating that the user wants to select and
manipulate data.
Cross-Reference
The unique capabilities of other list controls, including the MX DataGrid, TileList, and HorizontalList,
and the new Spark components, are described in Chapter 20.
n
Table 19.1 describes the components that have the capability to display dynamic data and support
user interaction using the list control model. In the Architecture column I show which component
architecture the most recent version of the component implements.
TABLE 19.1
The List Controls
Control Architecture Description
Advanced
DataGrid
MX
This component implements all the features of the MX
DataGrid
control but adds the capability to group and aggregate data and can
sort on multiple columns. This component is part of the Flex Data
Visualization components and is available only with a FlashBuilder
Premiere license.
ButtonBar
Spark
This new component presents Spark
ToggleButton objects
horizontally. The appearance and behavior are similar to the MX
ToggleButtonBar, but the application programming interface (API)
follows the list model, implementing the
change event and selected
Item
and selectedIndex properties.
ComboBox
Spark This component presents a drop-down list of simple string values. The
presentation of this component is similar to an HTML
<select> con-
trol that has its
size property set to 1, but enables the user to enter an
arbitrary string instead of selecting an item from the list.
DataGrid
MX This component presents a grid with multiple rows and columns. It is
used to present data received from a server-side database or other data
source that uses the spreadsheet-like rows-and-columns structure of
relational database tables.
DropDownList
Spark
Extended from the Spark
List control, this control shows a drop-
down list from which the user can select a value. Its
layout property
enables you to lay the list out with vertical, horizontal, or tile layout.
26_488959-ch19.indd 57226_488959-ch19.indd 572 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Chapter 19: Using List Controls
573
Control Architecture Description
Horizontal
List
MX This component presents a horizontal list of data items, typically ren-
dered with a custom item renderer. (For the Spark architecture, use a
List with layout set to HorizontalLayout.)
List
Spark This component presents a list box of data items. By default, the presenta-
tion of this component is similar to an HTML
<select> control that has
its size property set to a value greater than 1. Its
layout property enables
you to lay out the list’s items with a Spark layout object such as
HorizontalLayout or TileLayout.
OlapDataGrid
MX
This component expands on the
AdvancedDataGrid and supports pre-
sentation of results from an Online Analytical Processing (OLAP) query.
TileList
MX This component presents a grid of data items, typically rendered with
a custom item renderer. (For the Spark architecture, use a
List with
layout set to TileLayout.)
Tree
MX This component presents hierarchical data, commonly supplied by the
contents of an XML file.
In addition to the components listed in Table 19.1, the Flex SDK includes a set of MX-based list
controls designed for use in Adobe AIR applications. These controls provide the user with the abil-
ity to inspect and manipulate files and directories in the local file system and cannot be used in
Flex applications that are deployed over the Web. They include the
FileSystemList,
FileSystemComboBox, FileSystemDataGrid, and FileSystemTree components.
Most of the information in this chapter and in Chapter 20 about list and
DataGrid controls
applies equally to these AIR-based controls, but these controls add functionality that enables them
to populate their data from the directory and file contents of the local file system. They also imple-
ment additional properties and methods that are designed to support their unique purpose.
Note
Other MX components extend a class named ComboBase and therefore must be considered members of the
family of list controls as well. The
ColorPicker control is designed to enable selection of a color value from
a grid of “Web-safe” colors, and the
DateField control presents a pop-up calendar control. The components
aren’t often thought of as list controls, but they support the same set of properties, methods, and events as
their cousins. In the Flex4 SDK, there are no Spark equivalents to these components.
n
Each list control has its own unique visual presentation and behavior. As the developer, you select
the control most suited to your application’s requirements.
Figure 19.1 shows examples of the
List, DataGrid, and DropDownList controls, each using
the same set of data as its data provider.
On the Web
The application displayed in Figure 19.1 is available in the Web site files as ListControls.mxml in the
chapter19 project.
n
26_488959-ch19.indd 57326_488959-ch19.indd 573 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Part III: Working with Data
574
FIGURE 19.1
Commonly used list controls
Using Data Providers
The data you provide to a list control must be in the form of an ActionScript object, but for most
purposes you typically provide a set of data that’s been wrapped in one of the data collection
classes: either the
ArrayList or ArrayCollection classes for data that’s in rows and columns
or the
XMLListCollection class for hierarchical data.
The Spark and MX list controls have the same basic rules for their data providers: the data must be
provided as an ordered data collection. But the Spark controls (
List, DropDownList, and
ComboBox) specify that the data object must implement the IList interface, whereas the MX con-
trols accept any ActionScript
Object. In practical terms, this means that the MX DataGrid and
other related controls can accept a raw
Array as their dataProvider, while the new Spark con-
trols require an
ArrayList, ArrayCollection, or other class that implements the interface.
The
List, DropDownList, and ComboBox controls are distinguished from the DataGrid and
its related controls in that they present only a single column of data. They can present data from a
collection of complex objects, but by default they present only one value in each list item. In con-
trast, the
DataGrid control is designed to present data in multiple columns.
26_488959-ch19.indd 57426_488959-ch19.indd 574 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Chapter 19: Using List Controls
575
Using hard-coded data providers
You can embed data in a Flex application for use by either a specific instance of a list control or as
a separate data object that’s then linked to a control through a binding expression. Hard-coding
means that you declare actual data in the code, rather than retrieving it from an external data
source at runtime.
Caution
As described in Chapter 18, when you embed data in a Flex application, the compiled application file expands
accordingly. You should embed data only when it’s a small amount of content and won’t change during the
lifetime of the application.
n
Nesting hard-coded data in a data provider
When using a list control, you can nest hard-coded data in the declaration of a list control’s data-
Provider
by declaring the property with child-element syntax rather than attribute syntax. The
following code presents a
List control populated with a hard-coded data provider containing an
ArrayList of simple String values:
<s:List id=”sizeList”>
<s:dataProvider>
<s:ArrayList>
<fx:String>Small</fx:String>
<fx:String>Medium</fx:String>
<fx:String>Large</fx:String>
</s:ArrayList>
</s:dataProvider>
</s:List>
You also can declare the dataProvider with hard-coded collections of complex objects by nest-
ing multiple
<fx:Object> declarations within the <s:dataProvider> tag set:
<s:List id=”stateList” labelField=”stateName”>
<s:dataProvider>
<s:ArrayList>
<fx:Object>
<fx:stateName>California</fx:stateName>
<fx:capitol>Sacramento</fx:capitol>
</fx:Object>
<fx:Object>
<fx:stateName>Oregon</fx:stateName>
<fx:capitol>Salem</fx:capitol>
</fx:Object>
<fx:Object>
<fx:stateName>Washington</fx:stateName>
<fx:capitol>Olympia</fx:capitol>
</fx:Object>
<s:ArrayList>
</s:dataProvider>
</s:List>
26_488959-ch19.indd 57526_488959-ch19.indd 575 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Part III: Working with Data
576
Note
With MX controls, you can leave out the <s:ArrayList> element and nest the data elements directly with
the
<mx:dataProvider>. This isn’t possible with Spark list controls, because the MXML compiler doesn’t
know which implementing class of the
IList interface to use.
n
Modifying data with the ArrayList API
Because data is passed to the dataProvider as an ArrayList or ArrayCollection object,
the class’s API can be used to access and manipulate the data. Even though the original data is
hard-coded, the following ActionScript statement code would add a new item to the
List object’s
dataProvider when it contains simple String values:
sizeList.dataProvider.addItem(‘Extra Large’);
And this code would add a new item when it contains complex objects:
stateList.dataProvider.addItem({state:’New York’,’Albany’});
The application in Listing 19.1 uses a List object with a hard-coded data provider and then
enables the user to add data to the object with the
addItem() method.
LISTING 19.1
A List control with hard-coded data
<?xml version=”1.0” encoding=”utf-8”?>
<s:Application xmlns:fx=”http://ns.adobe.com/mxml/2009”
xmlns:s=”library://ns.adobe.com/flex/spark”
xmlns:mx=”library://ns.adobe.com/flex/mx”>
<s:layout>
<s:VerticalLayout horizontalAlign=”center” paddingTop=”20”/>
</s:layout>
<s:List id=”sizeList”>
<s:dataProvider>
<s:ArrayList>
<fx:String>Small</fx:String>
<fx:String>Medium</fx:String>
<fx:String>Large</fx:String>
</s:ArrayList>
</s:dataProvider>
</s:List>
<s:HGroup>
<s:Label text=”New Item:”/>
<s:TextInput id=”itemInput”/>
<s:Button label=”Add Item”
click=”sizeList.dataProvider.addItem(itemInput.text)”/>
</s:HGroup>
</s:Application>
26_488959-ch19.indd 57626_488959-ch19.indd 576 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Chapter 19: Using List Controls
577
On the Web
The code in Listing 19.1 is available in the Web site files as ListWithHardCodedData.mxml in the
chapter19 project.
n
Declaring separate data objects with MXML tags
You also can provide hard-coded data to a Spark list control from an <s:ArrayList> element
declared within an
<fx:Declarations> element or in ActionScript code. The application in
Listing 19.2 declares an
ArrayList and then provides the data to the List object through a
binding expression.
LISTING 19.2
A List control with data provided through a binding expression
<?xml version=”1.0” encoding=”utf-8”?>
<s:Application xmlns:fx=”http://ns.adobe.com/mxml/2009”
xmlns:s=”library://ns.adobe.com/flex/spark”
xmlns:mx=”library://ns.adobe.com/flex/mx”>
<s:layout>
<s:VerticalLayout horizontalAlign=”center” paddingTop=”20”/>
</s:layout>
<fx:Declarations>
<s:ArrayList id=”myData”>
<fx:String>Small</fx:String>
<fx:String>Medium</fx:String>
<fx:String>Large</fx:String>
</s:ArrayList>
</fx:Declarations>
<s:List id=”sizeList” dataProvider=”{myData}”/>
<s:HGroup>
<s:Label text=”New Item:”/>
<s:TextInput id=”itemInput”/>
<s:Button label=”Add Item”
click=”sizeList.dataProvider.addItem(itemInput.text)”/>
</s:HGroup>
</s:Application>
On the Web
The code in Listing 19.2 is available in the Web site files as ListWithBoundData.mxml in the chapter19
project.
n
Using dynamic data providers
Data retrieved from an external source, such as the results of a remote server call through the Remote
Procedure Call (RPC) components, or data retrieved from a local database (for an AIR desktop appli-
cation) is typically stored in a data collection object. As described in Chapter 18, the data collection is
typically declared in ActionScript code with the
[Bindable] metadata tag or in MXML code.
26_488959-ch19.indd 57726_488959-ch19.indd 577 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Part III: Working with Data
578
In ActionScript code, the declaration looks like this:
import mx.collections.ArrayList;
[Bindable]
private var myData:ArrayList = new ArrayList();
And in MXML, it looks like this:
<s:ArrayList id=”myData”/>
Note
Data objects that are declared in MXML are immediately instantiated and always bindable.
n
Regardless of how the data collection is declared, by making it bindable, you make it possible to
pass the data to a
List control with a simple binding expression:
<s:List id=”sizeList” dataProvider=”{myData}”/>
Using RPC components
You can choose to retrieve data dynamically from many sources, including the Flex SDK compo-
nents that are grouped together as the RPC classes. These classes are distinguished from each other
by the data format they use to communicate with a remote server:
l
HTTPService. This class sends simple HTTP requests to URLs that return data format-
ted as simple text or XML. For example, a call to an RSS feed from a blog or content-based
Web site would be executed using the
HTTPService class.
l
RemoteObject. This class sends and receives messages formatted in Action Message
Format (AMF). This binary format is defined by Adobe and implemented in many of its
server products, including LiveCycle Data Services, BlazeDS, and ColdFusion.
l
WebService. This class retrieves data from a server with calls formatted in the industry-
standard SOAP format.
These components and their methodologies are described starting in Chapter 23. All, however, are
capable of returning data sets in the form of
ArrayList or ArrayCollection objects that are
suitable for use as
List control data providers.
Note
The AMF data format was published by Adobe Systems in 2007 to support development of independent appli-
cation server products that are compatible with Flex- and Flash-based applications.
n
Retrieving local data in AIR applications
If you’re building an AIR-based desktop application, you can retrieve data from local XML files
using the
File and FileStream classes or from the local SQLite embedded database with
classes such as
SQLConnection and SQLStatement. These classes aren’t designed to return
data in the
ArrayList format directly; you typically need to manually wrap data into your data
collection objects with explicit ActionScript code.
26_488959-ch19.indd 57826_488959-ch19.indd 578 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Chapter 19: Using List Controls
579
Controlling List Item Labels
If a List control’s data provider contains simple values (such as String, Number, or Date),
these values are displayed on each item by default. If the data provider contains complex objects
(either instances of the ActionScript
Object class or of your own custom value object classes),
you can determine the text labels that are displayed in a
List control’s items using one of these
strategies:
l
The labelField property enables you to point to a specific named property of each
object whose values should be displayed.
l
The labelFunction property enables you to customize each item’s label with your own
ActionScript code.
Using the labelField property
Most List controls support the labelField property. This property enables you to indicate
which of the named properties of data items in the control’s data provider is displayed at runtime.
The default value of
labelField is label. As a result, if the data provider’s objects have a prop-
erty named
label, that property’s value is displayed. In the following code, the ArrayList con-
tains data objects with a
label property. The List control displays the label property’s value
on each of its items:
<fx:Declarations>
<s:ArrayList id=”stateData”>
<fx:Object>
<fx:label>CA</fx:label>
<fx:capitol>Sacramento</fx:capitol>
</fx:Object>
<fx:Object>
<fx:label>OR</fx:label>
<fx:capitol>Salem</fx:capitol>
</fx:Object>
</s:ArrayList>
</fx:Declarations>
<s:List id=”stateList” dataProvider=”{stateData}”/>
More commonly, the complex objects in the data collection have property names that are deter-
mined by the structure of a database table, XML file, value object, or other existing data source. If
you forget to set the
labelField property on a List control that displays complex data objects,
the control displays labels consisting of a set of
[] characters wrapped around the word object and
the object’s data type. If the data item is cast as an ActionScript
Object, the result looks like this:
[object Object]
As shown in Figure 19.2, the results aren’t particularly useful, even when working with a value
object class.
26_488959-ch19.indd 57926_488959-ch19.indd 579 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Part III: Working with Data
580
FIGURE 19.2
A List control displaying a complex data object with no labelField setting
To fix this behavior, you explicitly set the List control’s labelField to the name of the prop-
erty you want to display:
<fx:Declarations>
<s:ArrayList id=”stateData”>
<fx:Object>
<fx:state>CA</fx:state>
<fx:capitol>Sacramento</fx:capitol>
</fx:Object>
<fx:Object>
<fx:state>OR</fx:state>
<fx:capitol>Salem</fx:capitol>
</fx:Object>
</s:ArrayList>
</fx:Declarations>
<s:List id=”stateList” dataProvider=”{stateData}”
labelField=”state”/>
Figure 19.3 shows the same List control, this time displaying the value of the property named in
the control’s
labelField property.
The application in Listing 19.3 uses the
List control’s labelField property to determine which
property value of each data object is displayed at runtime.
LISTING 19.3
Using the labelField property
<?xml version=”1.0” encoding=”utf-8”?>
<s:Application xmlns:fx=”http://ns.adobe.com/mxml/2009”
xmlns:s=”library://ns.adobe.com/flex/spark”
26_488959-ch19.indd 58026_488959-ch19.indd 580 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
[...]... pattern, they enable Flex Builder and the compiler to validate property names and provide code completion For example, when a user selects an item that represents a complex data object from a List control, you should first cast the control’s selectedItem property as the appropriate ActionScript class You can then refer to the object’s named properties and gain the benefit of Flex Builder s and the compiler’s... properties and events to determine their presentation and behavior l The list controls include the Spark List, DropDownList, ComboBox and ButtonBar, and the MX List, ComboBox, DataGrid, TileList, HorizontalList, Tree, AdvancedDataGrid, and OLAPDataGrid controls l MX list controls designed exclusively for use with AIR applications populate their data with information from the local client file system l You handle... based on the Spark ItemRenderer container and includes both the image and a Label control that displays the raw data 5 94 Chapter 19: Using List Controls LISTING 19.8 Using an inline renderer . multiple columns.
26 _48 8959-ch19.indd 5 742 6 _48 8959-ch19.indd 5 74 3/5/10 2:32 PM3/5/10 2:32 PM
Please purchase PDF Split-Merge on www.verypdf.com to remove. unique events and properties designed for that control’s
specific purpose and capabilities.
26 _48 8959-ch19.indd 5 842 6 _48 8959-ch19.indd 5 84 3/5/10 2:32