UI Components
ListView
UI component for rendering large lists using view recycling.
<ListView> is a UI component that renders items in a vertically scrolling list, the template for the items can be defined via itemTemplate (or multiple templates via itemTemplates - more on that below). The ListView only renders the visible items, as the user scrolls, new items render by reusing a no-longer-visible item's view—this is usually referred to as view-recycling.


<ListView items="{{ items }}">
  <ListView.itemTemplate>
    <!-- The item template can only have a single root element -->
    <GridLayout padding="16" columns="20, *">
      <ContentView width="20" height="20" borderRadius="20" backgroundColor="#65adf1" />
      <Label text="{{ title }}" col="1" textWrap="true" marginLeft="8" />
    </GridLayout>
  </ListView.itemTemplate>
</ListView>const items = Array.from({ length: 100 }).map((_, i) => ({
  title: `Item ${i}`,
}))Examples 
ListView with multiple itemTemplates 
Individual items can be rendered using a different template. For example, let's say our items can either be headings or items. In that case, we can define a template for them, and pass in an itemTemplateSelector function that will get called before rendering an item.
<ListView items="{{ items }}" itemTemplateSelector="{{ itemTemplateSelector }}">
  <ListView.itemTemplates>
    <template key="heading">
      <!-- template for headings -->
    </template>
    <template key="item">
      <!-- template for items -->
    </template>
  </ListView.itemTemplates>
</ListView>// example item definition
type ItemType = {
  title: string
  type: 'heading' | 'item'
}
// called for each item in the list before rendering
function itemTemplateSelector(
  item: ItemType,
  index: number,
  items: Array<ItemType>
) {
  return item.type === 'heading' ? 'heading' : 'item'
}Props 
items 
items: Array | ObservableArrayGets or set the items of the ListView.
For static lists using an Array is fine, however for dynamically changed arrays it's recommended to use an ObservableArray to optimize re-rendering performance.
See ObservableArray.
itemTemplateSelector 
itemTemplateSelector: (
  item: T,
  index: number,
  items: Array | ObservableArray
) => stringA function to be called when selecting the template for the item.
itemTemplate 
itemTemplate: KeyedTemplateGets or sets the default item template.
Note: this is usually set by the framwork (eg. ListView.itemTemplate via xml).
See KeyedTemplate.
itemTemplates 
itemTemplates: KeyedTemplate[]Gets or sets the available itemTemplates.
Note: this is usually set by the framwork (eg. ListView.itemTemplates via xml).
See KeyedTemplate.
separatorColor 
separatorColor: ColorGets or sets the color of the line separating each item.
TIP
Set the separatorColor to transparent to hide it, or use your own borders.
See Color.
rowHeight 
rowHeight: numberGets or sets the row height of the ListView. Useful when your items have a fixed height, as the required calculations are greatly simplified and the rendering can be faster.
iosEstimatedRowHeight 
Gets or sets the estimated height of rows in the ListView. Default value: 44px
...Inherited 
For additional inherited properties, refer to the API Reference.
Methods 
refresh() 
listView.refresh()Forces the ListView to reload all its items.
scrollToIndex() 
listView.scrollToIndex(index: number)Scrolls the item with the specified index into view.
scrollToIndexAnimated() 
listView.scrollToIndexAnimated(index: number)Scrolls the item with the specified index into view with animation.
isItemAtIndexVisible() 
listView.isItemAtIndexVisible(index: number) // booleanChecks if the item with the specified index is visible.
Events 
itemTap 
on('itemTap', (args: ItemEventData) => {
  const listView = args.object as ListView
  console.log('Tapped index', args.index)
  console.log('Tapped item', listView.items[args.index])
})Emitted when a user taps an item in the ListView.
See ItemEventData.
itemsLoading 
on('itemsLoading', (args: ItemEventData) => {
  const listView = args.object as ListView
})Emitted when the ListView is loading/recycling an item. args.view is set if the ListView is recycling an item, otherwise it's undefined.
Note: frameworks use this event to update the args.view with new data.
See ItemEventData.
loadMoreItems 
on('loadMoreItems', (args: EventData) => {
  const listView = args.object as ListView
  // example: add new items
  listView.items.push(newItems)
})Emitted when the user reaches the end of the ListView. Useful for loading additional items (ie. infinite scroll).
Native component 
- Android: 
android.widget.ListView - iOS: 
UITableView 
- Previous
 - ListPicker
 - Next
 - Placeholder
 

