# Titanium.UI.ListView
A list view is used to present information, organized in to sections and items, in a vertically-scrolling view.
# Overview
Android | iOS |
---|---|
Use the Titanium.UI.createListView method or <ListView>
Alloy element to create a ListView
.
A ListView
object is a container for Titanium.UI.ListSection
objects that are, in turn, containers for Titanium.UI.ListItem objects. This is
easily visualized as an Alloy view:
<Alloy>
<ListView id="list">
<ListSection>
<ListItem title="List item 1"></ListItem>
<ListItem title="List item 2"></ListItem>
<ListItem title="List item 3"></ListItem>
</ListSection>
</ListView>
</Alloy>
For more instructions and examples of using ListView
, refer to the
ListViews guide (opens new window).
# Creating a List
To create a ListView
object using JavaScript, pass an array of ListDataItem objects to the list section's
Titanium.UI.ListSection.items property, which creates and adds each array
element as a row to a single Titanium.UI.ListSection. Use the ListView
's
Titanium.UI.ListView.sections property to add the section(s) to the list view.
By default, only the image
, title
and accessoryType
of a list data item
are displayed in the list. Refer to the next section for using an item template.
See the "List View Sections" example.
# Customizing the List Items
To create a custom list view, you need to define an ItemTemplate and define each view
component you want to add. Use the bindId
property of the child template to bind a dictionary
property in the item data to a child view component.
Map the template to a style name using the Titanium.UI.ListView.templates property, then use the style name to set the Titanium.UI.ListView.defaultItemTemplate property to globally change all item styles or set the ListDataItem.template property when passing in your list data to apply the template to that one list item or to override the globally defined template.
On iOS, you can specify one of the template constants for the ListDataItem.template property or Titanium.UI.ListView.defaultItemTemplate: Titanium.UI.LIST_ITEM_TEMPLATE_CONTACTS, Titanium.UI.LIST_ITEM_TEMPLATE_SETTINGS or Titanium.UI.LIST_ITEM_TEMPLATE_SUBTITLE.
See Titanium.UI.ListItem for a detailed description of creating list items with a custom item template and see the "List View with Custom Item Template" example for a sample.
# List and Table Views
This section describes the differences between the new list view and the old table view.
ListView
is analogous to TableView
, ListSection
is analogous to TableViewSection
, and
ListItem
is analogous to TableViewRow
.
Both list view and table view present data to user as a vertically scrolling list of rows. However, list view uses a data-oriented approach versus table view's view-oriented approach.
List view is designed for performance. One side effect of the design is that you cannot directly
manipulate the views--add children, set view properties and bind event callbacks--as you can in
TableView
. Instead, you interact with list items indirectly, using templates and data items. The
next subsection describes how to use list items.
# ListItem versus TableViewRow
With TableView
, you can directly add rows to a table view using the data property and its accessors.
With TableViewRows
, you can directly create a row using the Ti.UI.createTableViewRow
and customize
its styling by setting its view properties. You can add view subcomponents to the row using the add
method.
With ListView
, you need to explicitly create a ListSection
in order to add a ListItem
to a ListView
.
You cannot directly add a ListItem
to a ListView
.
In a TableView
, a TableViewRow
can be directly added to a TableView
because a
TableViewSection
is implicitly created and added to the TableView
.
A ListItem
object is not created in the same method as a TableViewRow
.
A ListItem
is created by passing an array of ListDataItem
objects to the ListSection
.
You cannot add views to a ListItem
using the add
method, which could be done with a
TableViewRow
. To add views to a ListItem
, you need to define an ItemTemplate,
which is bound to a list data item using the template
property.
You cannot explicitly set properties or bind events for a ListItem
. You have to set them using the
properties
dictionary of a ListDataItem or ItemTemplate and the events
dictionary of the
ItemTemplate or ViewTemplate, respectively.
# API Differences
TableViewRow properties: The following properties and their accessors are not available for
ListItem
:accessibilityLabel
,className
,editable
,hasCheck
,hasChild
,hasDetail
,leftImage
,moveable
andrightImage
.- For
hasCheck
,hasChild
, andhasDetail
, use theaccessoryType
property. - For
leftImage
andrightImage
, use theimage
property or create a custom item template.
- For
TableViewRow methods:
ListItem
does not support any methods. Adding views and binding event callbacks are supported through the item template.TableViewSection properties: The following properties and their accessors are not supported by
ListSection
:rows
androwCount
.- For
rows
, use theitems
property. - For
rowCount
, use theitemCount
property. (Not yet implemented.)
- For
TableViewSection methods: The following methods are not supported by
ListSection
:add
,remove
androwAtIndex
.- For
rowAtIndex
, use thegetItemAt
method. - For
add
andremove
, use the otherListSection
methods to manipulate theListItem
objects in theListSection
.
- For
TableView properties: The
data
property and its accessors are not available forListView
. Use thesections
property to set theListSections
for aListView
. You cannot directly addListItem
objects to aListView
.TableView methods: The following methods are not available to
ListView
:appendRow
,deleteRow
,deselectRow
,insertRowAfter
,insertRowBefore
,selectRow
,updateRow
,scrollToIndex
andselectRow
.- For
scrollToIndex
, use thescrollToItem
method. - For
selectRow
, use theselectItem
method. (Currently implemented only for iOS.) - For all other row methods, you cannot manipulate
ListItems
with aListView
. You have to manipulate them with theListSection
they are contained in.
- For
# List and Scroll Views
As a list view inherently scrolls, it creates a very poor user experience when it contains other scrolling views, such as a Titanium.UI.ScrollableView or Titanium.UI.TextArea. Thus, this layout is strongly discouraged.
# TextFields in Lists with SOFT_INPUT_ADJUST_PAN (Android)
In order to use Titanium.UI.TextField inside ListView
, Titanium.UI.Android.SOFT_INPUT_ADJUST_PAN
must be set to the window that is containing the ListView
, otherwise the Titanium.UI.TextField may not be able to gain focus.
When a Titanium.UI.TextField is placed in a row near the bottom of a ListView
,
in a window that is configured with
Titanium.UI.Android.SOFT_INPUT_ADJUST_PAN, it is expected for the
text field to automatically move to a visible position after it is focused and the software
keyboard displayed. However, due to a known problem caused by native Android's ListView
behavior,
the keyboard is likely to completely obscure the text field.
To mitigate this, a ScrollView
may be used instead of a list view, as demonstrated in the
Titanium.UI.ScrollView, "Scroll View as a Table View", example.
# Editing Support
Editing a ListView through user initiated actions is supported through the following properties.
ListItem properties:
Titanium.UI.ListItem.canEdit - When this is set to true, it allows the item to be deleted from the ListView through a user initiated action. The item can only be deleted when the ListView is in editing mode. The ListView can enter 'editing' mode either by explicitly setting the Titanium.UI.ListView.editing property to true, or by swiping accross an item whose
canEdit
property is set to true. When the user deletes the item, a Titanium.UI.ListView.delete event is fired.Titanium.UI.ListItem.editActions - When Titanium.UI.ListItem.canEdit is set to true, the default behavior is to allow the item to be deleted. This behavior can be overridden by using the Titanium.UI.ListItem.editActions property of the item. When this property is defined, the user is instead presented with the options as defined by the RowActionType.title property. In this scenario the ListView does not fire a Titanium.UI.ListView.delete event. Instead the Titanium.UI.ListView.editaction event is fired and the developer is free to update the ListView as required. This is supported on Titanium SDK 4.1.0 and later on the iOS platform.
Titanium.UI.ListItem.canInsert - When this is set to true, it allows the item to insert a new item to the ListView through a user initiated action. A new item can only be inserted when the ListView is in editing mode. The ListView can enter 'editing' mode by explicitly setting the Titanium.UI.ListView.editing property to true. When the user clicks on the '+' sign of the item, an Titanium.UI.ListView.insert event is fired. Note: A new item is not inserted automatically when clicking on the '+' sign to let you decide the way to insert a new item. You can use any inserting method of Titanium.UI.ListSection, for example Titanium.UI.ListSection.insertItemsAt and Titanium.UI.ListSection.appendItems.
Titanium.UI.ListItem.canMove - When this item is set to true, it allows the item to be moved to a different location within the ListView. The item can only be moved when the ListView is put in editing mode by explicitly setting the Titanium.UI.ListView.editing property to true. When the user moves an item, a Titanium.UI.ListView.move event is fired.
ListView properties:
Titanium.UI.ListView.editing - Determines if the List View is in a state where items can be deleted or reordered.
Titanium.UI.ListView.requiresEditingToMove - Determines if the ListView should be able to drag-and-drop without explicitely enabling editing support (like drag bars).
Titanium.UI.ListView.pruneSectionsOnEdit - When this property is set to true and the user action results in a section having no other items, the section is deleted from the List View. Please note that this property only applies to the sections whose items are being edited.
# Examples
# List View Sections
Creates a list with three sections, each with two rows. Adds two sections to the table before and one after it is rendered.
var win = Ti.UI.createWindow({backgroundColor: 'gray'});
var listView = Ti.UI.createListView();
var sections = [];
var fruitDataSet = [
{properties: { title: 'Apple'}},
{properties: { title: 'Banana'}},
];
var fruitSection = Ti.UI.createListSection({ headerTitle: 'Fruits', items: fruitDataSet});
sections.push(fruitSection);
var vegDataSet = [
{properties: { title: 'Carrots'}},
{properties: { title: 'Potatoes'}},
];
var vegSection = Ti.UI.createListSection({ headerTitle: 'Vegetables', items: vegDataSet});
sections.push(vegSection);
listView.sections = sections;
win.add(listView);
win.open();
var fishDataSet = [
{properties: { title: 'Cod'}},
{properties: { title: 'Haddock'}},
];
var fishSection = Ti.UI.createListSection({ headerTitle: 'Fish', items: fishDataSet});
listView.appendSection(fishSection);
# List View with Custom Item Template
Modifies the previous example to create a list using an item template to customize the view layout.
var win = Ti.UI.createWindow({backgroundColor: 'white'});
// Create a custom template that displays an image on the left,
// then a title next to it with a subtitle below it.
var myTemplate = {
childTemplates: [
{ // Image justified left
type: 'Ti.UI.ImageView', // Use an image view for the image
bindId: 'pic', // Maps to a custom pic property of the item data
properties: { // Sets the image view properties
width: '50dp', height: '50dp', left: 0
}
},
{ // Title
type: 'Ti.UI.Label', // Use a label for the title
bindId: 'info', // Maps to a custom info property of the item data
properties: { // Sets the label properties
color: 'black',
font: { fontFamily:'Arial', fontSize: '20dp', fontWeight:'bold' },
left: '60dp', top: 0,
}
},
{ // Subtitle
type: 'Ti.UI.Label', // Use a label for the subtitle
bindId: 'es_info', // Maps to a custom es_info property of the item data
properties: { // Sets the label properties
color: 'gray',
font: { fontFamily:'Arial', fontSize: '14dp' },
left: '60dp', top: '25dp',
}
}
]
};
var listView = Ti.UI.createListView({
// Maps myTemplate dictionary to 'template' string
templates: { 'template': myTemplate },
// Use 'template', that is, the myTemplate dict created earlier
// for all items as long as the template property is not defined for an item.
defaultItemTemplate: 'template'
});
var sections = [];
var fruitDataSet = [
// the text property of info maps to the text property of the title label
// the text property of es_info maps to text property of the subtitle label
// the image property of pic maps to the image property of the image view
{ info: {text: 'Apple'}, es_info: {text: 'Manzana'}, pic: {image: 'apple.png'}},
{ info: {text: 'Banana'}, es_info: {text: 'Banana'}, pic: {image: 'banana.png'}}
];
var fruitSection = Ti.UI.createListSection({ headerTitle: 'Fruits / Frutas', items: fruitDataSet});
sections.push(fruitSection);
var vegDataSet = [
{ info: {text: 'Carrot'}, es_info: {text: 'Zanahoria'}, pic: {image: 'carrot.png'}},
{ info: {text: 'Potato'}, es_info: {text: 'Patata'}, pic: {image: 'potato.png'}}
];
var vegSection = Ti.UI.createListSection({ headerTitle: 'Vegetables / Verduras', items: vegDataSet});
sections.push(vegSection);
var grainDataSet = [
{ info: {text: 'Corn'}, es_info: {text: 'Maiz'}, pic: {image: 'corn.png'}},
{ info: {text: 'Rice'}, es_info: {text: 'Arroz'}, pic: {image: 'rice.png'}}
];
var grainSection = Ti.UI.createListSection({ headerTitle: 'Grains / Granos', items: grainDataSet});
sections.push(grainSection);
listView.sections = sections;
win.add(listView);
win.open();
# List View with a pullView
This sample shows how the Titanium.UI.ListView.pullView property could be utilized along with the Titanium.UI.ListView.pull and Titanium.UI.ListView.pullend events to create a refresh control.
var win = Ti.UI.createWindow();
var listView = Ti.UI.createListView({height:'90%', top:0});
var sections = [];
var fruitDataSet = [
{properties: { title: 'Apple'}},
{properties: { title: 'Banana'}},
];
var fruitSection = Ti.UI.createListSection({ headerTitle: 'Fruits', items: fruitDataSet});
sections.push(fruitSection);
var vegDataSet = [
{properties: { title: 'Carrots'}},
{properties: { title: 'Potatoes'}},
];
var vegSection = Ti.UI.createListSection({ headerTitle: 'Vegetables', items: vegDataSet});
var fishDataSet = [
{properties: { title: 'Cod'}},
{properties: { title: 'Haddock'}},
];
var fishSection = Ti.UI.createListSection({ headerTitle: 'Fish', items: fishDataSet});
listView.sections = sections;
var refreshCount = 0;
function getFormattedDate(){
var date = new Date();
return date.getMonth() + '/' + date.getDate() + '/' + date.getFullYear() + ' ' + date.getHours() + ':' + date.getMinutes();
}
function resetPullHeader(){
actInd.hide();
imageArrow.transform=Ti.UI.createMatrix2D();
if (refreshCount < 2) {
imageArrow.show();
labelStatus.text = 'Pull down to refresh...';
labelLastUpdated.text = 'Last Updated: ' + getFormattedDate();
} else {
labelStatus.text = 'Nothing To Refresh';
labelLastUpdated.text = 'Last Updated: ' + getFormattedDate();
listView.removeEventListener('pull', pullListener);
listView.removeEventListener('pullend', pullendListener);
eventStatus.text = 'Removed event listeners.';
}
listView.setContentInsets({top:0}, {animated:true});
}
function loadTableData()
{
if (refreshCount == 0) {
listView.appendSection(vegSection);
} else if (refreshCount == 1) {
listView.appendSection(fishSection);
}
refreshCount ++;
resetPullHeader();
}
function pullListener(e){
eventStatus.text = 'EVENT pull FIRED. e.active = '+e.active;
if (e.active == false) {
var unrotate = Ti.UI.createMatrix2D();
imageArrow.animate({transform:unrotate, duration:180});
labelStatus.text = 'Pull down to refresh...';
} else {
var rotate = Ti.UI.createMatrix2D().rotate(180);
imageArrow.animate({transform:rotate, duration:180});
if (refreshCount == 0) {
labelStatus.text = 'Release to get Vegetables...';
} else {
labelStatus.text = 'Release to get Fish...';
}
}
}
function pullendListener(e){
eventStatus.text = 'EVENT pullend FIRED.';
if (refreshCount == 0) {
labelStatus.text = 'Loading Vegetables...';
} else {
labelStatus.text = 'Loading Fish...';
}
imageArrow.hide();
actInd.show();
listView.setContentInsets({top:80}, {animated:true});
setTimeout(function(){
loadTableData();
}, 2000);
}
var tableHeader = Ti.UI.createView({
backgroundColor:'#e2e7ed',
width:320, height:80
});
var border = Ti.UI.createView({
backgroundColor:'#576c89',
bottom:0,
height:2
});
tableHeader.add(border);
var imageArrow = Ti.UI.createImageView({
image:'arrow.png',
left:20, bottom:10,
width:23, height:60
});
tableHeader.add(imageArrow);
var labelStatus = Ti.UI.createLabel({
color:'#576c89',
font:{fontSize:13, fontWeight:'bold'},
text:'Pull down to refresh...',
textAlign:'center',
left:55, bottom:30,
width:200
});
tableHeader.add(labelStatus);
var labelLastUpdated = Ti.UI.createLabel({
color:'#576c89',
font:{fontSize:12},
text:'Last Updated: ' + getFormattedDate(),
textAlign:'center',
left:55, bottom:15,
width:200
});
tableHeader.add(labelLastUpdated);
var actInd = Ti.UI.createActivityIndicator({
left:20, bottom:13,
width:30, height:30
});
tableHeader.add(actInd);
listView.pullView = tableHeader;
listView.addEventListener('pull', pullListener);
listView.addEventListener('pullend',pullendListener);
var eventStatus = Ti.UI.createLabel({
font:{fontSize:13, fontWeight:'bold'},
text: 'Event data will show here',
bottom:0,
height:'10%'
})
win.add(listView);
win.add(eventStatus);
win.open();
# Alloy XML Markup
'List View with Custom Item Template' as an Alloy view. List view markup is supported in Alloy 1.2.0 and later.
app/views/index.xml
:
<Alloy>
<Window>
<ListView id="listView" defaultItemTemplate="template">
<!-- The Templates tag sets the ListView's templates property -->
<Templates>
<!-- Define your item templates within the Templates tags or use the
Require tag to include a view that only contains an ItemTemplate -->
<ItemTemplate name="template">
<ImageView bindId="pic" id="icon" />
<Label bindId="info" id="title" />
<Label bindId="es_info" id="subtitle" />
</ItemTemplate>
</Templates>
<ListSection headerTitle="Fruit / Frutas">
<!-- You can specify any ListItem or ListDataItem properties in ListItem -->
<!-- Specify data to bind to the item template with inline attributes
defined as <bindId>:<Ti.UI.Component.property> -->
<ListItem info:text="Apple" es_info:text="Manzana" pic:image="/apple.png" />
<ListItem info:text="Banana" es_info:text="Banana" pic:image="/banana.png" />
</ListSection>
<ListSection headerTitle="Vegetables / Verduras">
<ListItem info:text="Carrot" es_info:text="Zanahoria" pic:image="/carrot.png" />
<ListItem info:text="Potato" es_info:text="Patata" pic:image="/potato.png" />
</ListSection>
<ListSection headerTitle="Grains / Granos">
<ListItem info:text="Corn" es_info:text="Maiz" pic:image="/corn.png" />
<ListItem info:text="Rice" es_info:text="Arroz" pic:image="/rice.png" />
</ListSection>
</ListView>
</Window>
</Alloy>
app/styles/index.tss
:
"#icon" : {
width: '50dp', height: '50dp', left: 0
},
"#title" : {
color: 'black',
font: { fontFamily:'Arial', fontSize: '20dp', fontWeight:'bold' },
left: '60dp', top: 0
},
"#subtitle" : {
color: 'gray',
font: { fontFamily:'Arial', fontSize: '14dp' },
left: '60dp', top: '25dp'
}
# Alloy example of ListView properties
Supported in Alloy 1.3.0 and later.
In Alloy, ListView's searchView
, headerView
, footerView
, and pullView
properties may be declared as XML elements inline with the ListView
element. The example
below demonstrates how to use searchView
, headerView
and footerView
.
<Alloy>
<Window fullscreen="true">
<ListView>
<!-- Sets ListView's searchView property.
For Android, you can also do <SearchView platform="android" />
to use a Ti.UI.Android.SearchView instead of a search bar. -->
<SearchBar barColor="#000" />
<!-- Sets ListView's headerView property -->
<HeaderView>
<View backgroundColor="#DDD" height="Ti.UI.SIZE">
<Label>Header View</Label>
</View>>
</HeaderView>
<ListSection>
<ListItem title="Papaya" searchableText="Papaya"/>
<ListItem title="Peach" searchableText="Peach"/>
<ListItem title="Pear" searchableText="Pear"/>
<ListItem title="Persimmon" searchableText="Persimmon"/>
<ListItem title="Pineapple" searchableText="Pineapple"/>
<ListItem title="Pluot" searchableText="Pluto"/>
<ListItem title="Pomegranate" searchableText="Pomegranate"/>
</ListSection>
<!-- Sets ListView's footerView property -->
<FooterView>
<View backgroundColor="#DDD" height="Ti.UI.SIZE">
<Label>Footer View</Label>
</View>
</FooterView>
</ListView>
</Window>
</Alloy>
# Alloy example of <PullView>
element
The example below demonstrates how to use a <PullView>
Alloy element.
<!-- views/index.xml -->
<Alloy>
<Window class="container" >
<ListView id="list">
<ListSection>
<ListItem title="Number 1"></ListItem>
<ListItem title="Number 2"></ListItem>
</ListSection>
<PullView>
<View backgroundColor="red" height="50">
<Label>Release to reload</Label>
</View>
</PullView>
</ListView>
</Window>
</Alloy>
# Properties
# accessibilityDisableLongPress CREATION ONLY
Boolean value to remove the long press notification for the device's accessibility service.
Will disable the "double tap and hold for long press" message when selecting an item.
Default: true
Whether the view should be "hidden" from (i.e., ignored by) the accessibility service.
On iOS this is a direct analog of the accessibilityElementsHidden
property defined in the
UIAccessibility
Protocol.
On Android, setting accessibilityHidden
calls the native
View.setImportantForAccessibility
method. The native method is only available in Android 4.1 (API level 16/Jelly Bean) and
later; if this property is specified on earlier versions of Android, it is ignored.
Default: false
# accessibilityHint
Briefly describes what performing an action (such as a click) on the view will do.
On iOS this is a direct analog of the accessibilityHint
property defined in the
UIAccessibility Protocol.
On Android, it is concatenated together with
accessibilityLabel and accessibilityValue in the order: accessibilityLabel
,
accessibilityValue
, accessibilityHint
. The concatenated value is then passed as the
argument to the native View.setContentDescription method.
Default: null
# accessibilityLabel
A succint label identifying the view for the device's accessibility service.
On iOS this is a direct analog of the accessibilityLabel
property defined in the
UIAccessibility Protocol.
On Android, it is concatenated together with
accessibilityValue and accessibilityHint in the order: accessibilityLabel
,
accessibilityValue
, accessibilityHint
. The concatenated value is then passed as the
argument to the native View.setContentDescription method.
Defaults to Title or label of the control.
# accessibilityValue
A string describing the value (if any) of the view for the device's accessibility service.
On iOS this is a direct analog of the accessibilityValue
property defined in the
UIAccessibility Protocol.
On Android, it is concatenated together with
accessibilityLabel and accessibilityHint in the order: accessibilityLabel
,
accessibilityValue
, accessibilityHint
. The concatenated value is then passed as the
argument to the native View.setContentDescription method.
Defaults to State or value of the control.
# allowsMultipleSelectionDuringEditing
Determines whether multiple items of this list view can be selected at the same time while editing the table.
Default: false
# allowsMultipleSelectionInteraction
Allows a two-finger pan gesture to automatically transition the table view into editing mode and start selecting rows.
Setting this property to true allows the user to start selecting multiple contiguous rows via a two-finger pan gesture. If the table view is already in editing mode, the user can also select multiple rows via a one-finger pan gesture along the edge of the table that contains editing controls (checkboxes). In order to support this behavior, you must also set allowsMultipleSelectionDuringEditing to true. Once user interaction stops the itemsselected event is fired.
Default: false
# allowsSelection
Determines whether this item can be selected.
Set to false
to prevent the item from being selected.
On iOS, even if this property is set to false
, you can interact with the detail disclosure
accessory (accessoryType
set to LIST_ACCESSORY_TYPE_DETAIL) and any child
templates that are controls, such as a button, slider, etc.
Default: true
# allowsSelectionDuringEditing
Determines whether this list view items can be selected while editing the table.
Default: false
# anchorPoint
Coordinate of the view about which to pivot an animation.
Used on iOS only. For Android, use anchorPoint.
Anchor point is specified as a fraction of the view's size. For example, {0, 0}
is at
the view's top-left corner, {0.5, 0.5}
at its center and {1, 1}
at its bottom-right
corner.
See the "Using an anchorPoint" example in Titanium.UI.Animation for a demonstration. The default is center of this view.
# apiName READONLY
The name of the API that this proxy corresponds to.
The value of this property is the fully qualified name of the API. For example, Titanium.UI.Button
returns Ti.UI.Button
.
# backgroundColor
Background color of the view, as a color name or hex triplet.
For information about color values, see the "Colors" section of Titanium.UI. Defaults to Transparent
.
# backgroundDisabledColor
Disabled background color of the view, as a color name or hex triplet.
For information about color values, see the "Colors" section of Titanium.UI. Defaults to the normal background color of this view.
# backgroundDisabledImage
Disabled background image for the view, specified as a local file path or URL.
If backgroundDisabledImage
is undefined, and the normal background imagebackgroundImage
is set, the normal image is used when this view is disabled.
# backgroundFocusedColor
Focused background color of the view, as a color name or hex triplet.
For information about color values, see the "Colors" section of Titanium.UI.
For normal views, the focused color is only used if focusable
is true
.
Defaults to the normal background color of this view.
# backgroundFocusedImage
Focused background image for the view, specified as a local file path or URL.
For normal views, the focused background is only used if focusable
is true
.
If backgroundFocusedImage
is undefined, and the normal background image backgroundImage
is set, the normal image is used when this view is focused.
# backgroundGradient
A background gradient for the view.
A gradient can be defined as either linear or radial. A linear gradient varies continuously
along a line between the startPoint
and endPoint
.
A radial gradient is interpolated between two circles, defined by startPoint
and
startRadius
and endPoint
and endRadius
respectively.
The start points, end points and radius values can be defined in device units, in the view's coordinates, or as percentages of the view's size. Thus, if a view is 60 x 60, the center point of the view can be specified as:
{ x: 30, y: 30 }
Or:
{ x: '50%', y: '50%' }
When specifying multiple colors, you can specify an offset value for each color, defining how far into the gradient it takes effect. For example, the following color array specifies a gradient that goes from red to blue back to red:
colors: [ { color: 'red', offset: 0.0}, { color: 'blue', offset: 0.25 }, { color: 'red', offset: 1.0 } ]
Android's linear gradients ignores backfillStart
and backfillEnd
, treating them as if
they are true. Android's radial gradients ignore the endPoint
property.
Defaults to no gradient.
# backgroundImage
Background image for the view, specified as a local file path or URL.
Default behavior when backgroundImage
is unspecified depends on the type of view and the platform.
For generic views, no image is used. For most controls (buttons, textfields, and so on), platform-specific default images are used.
# backgroundLeftCap
Size of the left end cap.
See the section on backgroundLeftCap and backgroundTopCap behavior on iOS in Titanium.UI.View.
Default: 0
# backgroundRepeat
Determines whether to tile a background across a view.
Setting this to true
makes the set backgroundImage
repeat across the view as a series
of tiles. The tiling begins in the upper-left corner, where the upper-left corner of the
background image is rendered. The image is then tiled to fill the available space of the
view.
Note that setting this to true
may incur performance penalties for large views or
background images, as the tiling must be redone whenever a view is resized.
On iOS, the following views do not currently support tiled backgrounds:
Default: false
# backgroundTopCap
Size of the top end cap.
See the section on backgroundLeftCap and backgroundTopCap behavior on iOS in Titanium.UI.View.
Default: 0
# borderColor
Border color of the view, as a color name or hex triplet.
For information about color values, see the "Colors" section of Titanium.UI.
Defaults to the normal background color of this view (Android), black (iOS).
# borderRadius
Radius for the rounded corners of the view's border.
Each corner is rounded using an arc of a circle.
Values for each corner can be specified. For example, '20px 20px' will set both left and right corners to 20px
.
Specifying '20px 20px 20px 20px' will set top-left, top-right, bottom-right and bottom-left corners in that order.
If you have issues with dark artifacts on Android you can try to disable Hardware acceleration by setting a
backgroundColor
with a small amount of transparency: backgroundColor:"rgba(255,255,255,254)"
.
Default: 0
# borderWidth
Border width of the view.
If borderColor is set without borderWidth, this value will be changed to 1 of the unit declared as 'ti.ui.defaultunit' in tiapp.xml descriptor.
Default: 0
# bottom
View's bottom position, in platform-specific units.
This position is relative to the view's parent. Exact interpretation depends on the parent view's layout property. Can be either a float value or a dimension string (for example, '50%' or '10px').
This is an input property for specifying where the view should be positioned, and does not represent the view's calculated position.
Defaults to undefined
.
# bubbleParent
Indicates if the proxy will bubble an event to its parent.
Some proxies (most commonly views) have a relationship to other proxies, often established by the add() method. For example, for a button added to a window, a click event on the button would bubble up to the window. Other common parents are table sections to their rows, table views to their sections, and scrollable views to their views. Set this property to false to disable the bubbling to the proxy's parent.
Default: true
# canScroll
Determines if the list view can scroll in response to user actions.
Set to false to disable scrolling.
Default: true
# caseInsensitiveSearch
Determines if the search performed is case insensitive.
Used in conjunction with searchView and searchText properties of List View and searchableText property of List Item.
Default: true
# center
View's center position, in the parent view's coordinates.
This is an input property for specifying where the view should be positioned, and does not represent the view's calculated position.
Defaults to undefined
.
# clipMode
View's clipping behavior.
Setting this to CLIP_MODE_ENABLED enforces all child views to be clipped to this views bounds. Setting this to CLIP_MODE_DISABLED allows child views to be drawn outside the bounds of this view. When set to CLIP_MODE_DEFAULT or when this property is not set, clipping behavior is inferred. See section on iOS Clipping Behavior in Titanium.UI.View.
Defaults to undefined
. Behaves as if set to CLIP_MODE_DEFAULT.
# contentOffset
X and Y coordinates to which to reposition the top-left point of the content region.
# continuousUpdate
Determines if the scrolling event should fire every time there is a new visible item.
When setting continuousUpdate
to true
the scrolling event will fire every time a new item is scrolled in.
Default: false
# defaultItemTemplate
Sets the default template for list data items that do not specify the template
property.
Can be set to any of the built-in templates or those defined in the templates
property.
Can be changed dynamically.
Default: Titanium.UI.LIST_ITEM_TEMPLATE_DEFAULT
# dimBackgroundForSearch CREATION ONLY
A Boolean indicating whether the underlying content is dimmed during a search.
If you do not want to show the dimmed background when clicking on the search bar,
set this property false
during creation.
Default: true
# disableBounce
Determines whether the scroll-bounce of the list view should be disabled.
Set to true
to disable the vertical bounce.
Default: false
# editing
Determines if the list view is currently in editing mode.
For more information see the "Editing Support" section of Titanium.UI.ListView.
Default: false
# elevation
Base elevation of the view relative to its parent in pixels.
The elevation of a view determines the appearance of its shadow. Higher elevations produce larger and softer shadows.
Note: The elevation
property only works on Titanium.UI.View
objects.
Many Android components have a default elevation that cannot be modified.
For more information, see
Google design guidelines: Elevation and shadows.
# fastScroll
Sets the fastScroll mode on Android ListViews.
Set to true
to enable fastScroll mode. When fast scrolling is enabled, the user
can quickly scroll through lists by dragging the fast scroll thumb.
Default: false
# filterTouchesWhenObscured
Discards touch related events if another app's system overlay covers the view.
This is a security feature to protect an app from "tapjacking", where a malicious app can use a system overlay to intercept touch events in your app or to trick the end-user to tap on UI in your app intended for the overlay.
Setting this property to true
causes touch related events (including "click") to not be fired
if a system overlay overlaps the view.
Default: false
# fixedSize CREATION ONLY
Sets fixedSize mode on Android ListViews.
Set it to true
if all ListItems have the same size to gain some performance.
Default: false
# focusable
Whether view should be focusable while navigating with the trackball.
Default: false
When set to false, the ListView will not draw the divider before the footer view.
Default: undefined but behaves as false
List view footer title.
List view footer as a view that will be rendered instead of a label.
In Alloy you can specify this property with a <FooterView>
child element of a <ListView>
element (see Examples). On Android, this is a creation only property.
# forceUpdates
Optimize the continuousUpdate
scrolling event.
If continuousUpdate
is enabled and you set forceUpdates
to true
it will fire the scrolling](Titanium.UI.ListView.scrolling) all the time.
Otherwise it will only update when a new item is scrolled in (default).
Default: false
# headerDividersEnabled CREATION ONLY
When set to false, the ListView will not draw the divider after the header view.
Default: undefined but behaves as false
# headerView
List view header as a view that will be rendered instead of a label.
On Android, this is a creation only property.
In Alloy you can specify this property with a <HeaderView>
child element of a <ListView>
element (see Examples).
# height
View height, in platform-specific units.
Defaults to: If undefined, defaults to either FILL or SIZE depending on the view. See "View Types and Default Layout Behavior" in Transitioning to the New UI Layout System.
Can be either a float value or a dimension string (for example, '50%' or '40dp'). Can also be one of the following special values:
- SIZE. The view should size itself to fit its contents.
- FILL. The view should size itself to fill its parent.
- 'auto'. Represents the default sizing behavior for a given type of
view. The use of 'auto' is deprecated, and should be replaced with the
SIZE
orFILL
constants if it is necessary to set the view's behavior explicitly.
This is an input property for specifying the view's height dimension. To determine the view's size once rendered, use the rect or size properties.
Sets the behavior when hiding an object to release or keep the free space
If setting hiddenBehavior
to HIDDEN_BEHAVIOR_GONE it will automatically release the space the view occupied.
For example: in a vertical layout the views below the object will move up when you hide
an object with hiddenBehavior:Titanium.UI.HIDDEN_BEHAVIOR_GONE
.
- HIDDEN_BEHAVIOR_INVISIBLE. Keeps the space and just hides the object (default).
- HIDDEN_BEHAVIOR_GONE. Releases the space and hides the object.
Defaults to Titanium.UI.HIDDEN_BEHAVIOR_INVISIBLE.
# horizontalMotionEffect
Adds a horizontal parallax effect to the view
Note that the parallax effect only happens by tilting the device so results can not be seen on Simulator. To clear all motion effects, use the <Titanium.UI.clearMotionEffects> method.
# horizontalWrap
Determines whether the layout has wrapping behavior.
For more information, see the discussion of horizontal layout mode in the description of the layout property.
Default: true
# id
View's identifier.
The id
property of the Ti.UI.View represents the view's identifier. The identifier string does
not have to be unique. You can use this property with getViewById method.
# keepScreenOn
Determines whether to keep the device screen on.
When true
the screen will not power down. Note: enabling this feature will use more
power, thereby adversely affecting run time when on battery.
For iOS look at idleTimerDisabled.
Default: false
# keepSectionsInSearch
Determines if the section information is displayed in the search results when using the searchText
property.
Used in conjunction with searchText property of List View and searchableText property of List Item.
Default: false
# keyboardDismissMode
The manner in which the keyboard is dismissed when a drag begins in the list view.
Default: Undefined (behaves like <Titanium.UI.iOS.KEYBOARD_DISMISS_MODE_NONE>)
# layout
Specifies how the view positions its children. One of: 'composite', 'vertical', or 'horizontal'.
There are three layout options:
-
composite
(orabsolute
). Default layout. A child view is positioned based on its positioning properties or "pins" (top
,bottom
,left
,right
andcenter
). If no positioning properties are specified, the child is centered.The child is always sized based on its
width
andheight
properties, if these are specified. If the child's height or width is not specified explicitly, it may be calculated implicitly from the positioning properties. For example, if bothleft
andcenter.x
are specified, they can be used to calculate the width of the child control.Because the size and position properties can conflict, there is a specific precedence order for the layout properties. For vertical positioning, the precedence order is:
height
,top
,center.y
,bottom
.The following table summarizes the various combinations of properties that can be used for vertical positioning, in order from highest precedence to lowest. (For example, if
height
,center.y
andbottom
are all specified, theheight
andcenter.y
values take precedence.)Scenario Behavior height
&top
specifiedChild positioned top
unit from parent's top, using specifiedheight
; anycenter.y
andbottom
values are ignored.height
¢er.y
specifiedChild positioned with center at center.y
, using specifiedheight
; anybottom
value is ignored.height
&bottom
specifiedChild positioned bottom
units from parent's bottom, using specifiedheight
.top
¢er.y
specifiedChild positioned with top edge top
units from parent's top and center atcenter.y
. Height is determined implicitly; anybottom
value is ignored.top
&bottom
specifiedChild positioned with top edge top
units from parent's top and bottom edgebottom
units from parent's bottom. Height is determined implicitly.Only top
specifiedChild positioned top
units from parent's top, and uses the default height calculation for the view type.center.y
andbottom
specifiedChild positioned with center at center.y
and bottom edgebottom
units from parent's bottom. Height is determined implicitly.Only center.y
specifiedChild positioned with center at center.y
, and uses the default height calculation for the view type.Only bottom
specifiedChild positioned with bottom edge bottom
units from parent's bottom, and uses the default height calculation for the view type.height
,top
,center.y
, andbottom
unspecifiedChild entered vertically in the parent and uses the default height calculation for the child view type. Horizontal positioning works like vertical positioning, except that the precedence is
width
,left
,center.x
,right
.For complete details on composite layout rules, see Transitioning to the New UI Layout System in the Titanium Mobile Guides.
-
vertical
. Children are laid out vertically from top to bottom. The first child is laid outtop
units from its parent's bounding box. Each subsequent child is laid out below the previous child. The space between children is equal to the upper child'sbottom
value plus the lower child'stop
value.Each child is positioned horizontally as in the composite layout mode.
-
horizontal
. Horizontal layouts have different behavior depending on whether wrapping is enabled. Wrapping is enabled by default (thehorizontalWrap
property istrue
).With wrapping behavior, the children are laid out horizontally from left to right, in rows. If a child requires more horizontal space than exists in the current row, it is wrapped to a new row. The height of each row is equal to the maximum height of the children in that row.
Wrapping behavior is available on iOS and Android. When the
horizontalWrap
property is set to true, the first row is placed at the top of the parent view, and successive rows are placed below the first row. Each child is positioned vertically within its row somewhat like composite layout mode. In particular:- If neither
top
orbottom
is specified, the child is centered in the row. - If either
top
orbottom
is specified, the child is aligned to either the top or bottom of the row, with the specified amount of padding. - If both
top
andbottom
is specified for a given child, the properties are both treated as padding.
If the
horizontalWrap
property is false, the behavior is more equivalent to a vertical layout. Children are laid or horizontally from left to right in a single row. Theleft
andright
properties are used as padding between the children, and thetop
andbottom
properties are used to position the children vertically.Defaults to Composite layout.
- If neither
# lazyLoadingEnabled
Determines if the list view should use lazy loading to load remote images.
Lazy loading is used to load remote images only if they are in the visible view area. It is enabled by default. If you disable it, images will be loaded even if they are currently not visible. Disabling improves the loading of images, but can also cause trouble in list views having a lot of remote images, because every remote image opens a new HTTP request.
Default: true
# left
View's left position, in platform-specific units.
This position is relative to the view's parent. Exact interpretation depends on the parent view's layout property. Can be either a float value or a dimension string (for example, '50%' or '10px').
This is an input property for specifying where the view should be positioned, and does not represent the view's calculated position.
Defaults to undefined
.
# lifecycleContainer
The Window or TabGroup whose Activity lifecycle should be triggered on the proxy.
If this property is set to a Window or TabGroup, then the corresponding Activity lifecycle event callbacks will also be called on the proxy. Proxies that require the activity lifecycle will need this property set to the appropriate containing Window or TabGroup.
# listSeparatorInsets
The insets for the list view header and footer.
Cell separators do not extend all the way to the edge of the list view. Set this to a
dictionary with two keys, left
specifying inset from left edge and right
specifying the inset from the
right edge. If the rowSeparatorInsets is not set, the listSeparatorInsets will also set the cell insets.
For example:
listView.listSeparatorInsets = {
left: 10,
right: 10
};