---
title: PropertyList
---
[PropertyList](/scripting/api-reference/interfaces/property-list) is a mutable list of [ViewModel](/scripting/api-reference/artboards/view-model) items.
Use it to manage repeating data collections from scripts (for example, menu
items, inventory entries, or dynamic UI rows). A [PropertyList](/scripting/api-reference/interfaces/property-list) supports:
- Reading item count via `length`
- 1-based indexed access (`list[1]`, `list[2]`, ...)
- Mutations (`push`, `insert`, `swap`, `pop`, `shift`, `clear`)
- Change notifications via `addListener` and `removeListener`
For a complete working example, see the [Scripting Lists](https://rive.app/community/files/27098-51051-scripting-lists/?utm_source=docs&utm_medium=scripting_api&utm_campaign=docs_to_marketplace_links) demo.
## Fields
### `length`
The current number of items in the list.
```lua highlight={3}
function handleSwap(self: MenuListController)
if self.menu and self.menu.length >= 2 then
self.menu:swap(1, 2)
end
end
```
### `addListener`
Adds a listener that is called when the list changes.
```lua highlight={6}
function init(self: MenuListController, context: Context): boolean
local vmi = context:rootViewModel() :: Data.Main
if vmi then
self.menu = vmi.menu
self.listChanged = listChanged
self.menu:addListener(self.listChanged)
else
print('[MenuListController] Warning: Could not find Main ViewModel.')
end
return true
end
```
### `removeListener`
Removes a previously added list-change listener.
```lua highlight={3}
function handleRemoveListener(self: MenuListController)
if self.menu and self.listChanged then
self.menu:removeListener(self.listChanged)
end
end
```
## Methods
### `push`
{/* function push(self, vm: ViewModel): () */}
```lua
push(vm: ViewModel) -> ()
```
Get the list item by index.
```lua highlight={3}
function setItemLabel(menu: PropertyList, index: number, label: string)
if index >= 1 and index <= menu.length then
local item = menu[index] :: Data.Button
local itemLabel = item:getString('label')
if itemLabel then
itemLabel.value = label
end
end
end
```
Adds a view model to the end of the list.
```lua highlight={9}
function addButton(menu: PropertyList, label: string)
local buttonVm = Data.Button.new()
local buttonLabel = buttonVm:getString('label')
if buttonLabel then
buttonLabel.value = label
end
menu:push(buttonVm)
end
```
### `insert`
{/* function insert(self, vm: ViewModel, index: number): () */}
```lua
insert(vm: ViewModel, index: number) -> ()
```
Inserts a view model at the given index.
```lua highlight={10}
function insertAt(menu: PropertyList, label: string, index: number)
local buttonVm = Data.Button.new()
local buttonLabel = buttonVm:getString('label')
if buttonLabel then
buttonLabel.value = label
end
local insertIndex = math.max(1, math.min(index, menu.length + 1))
menu:insert(buttonVm, insertIndex)
end
```
### `swap`
{/* function swap(self, index1: number, index2: number): () */}
```lua
swap(index1: number, index2: number) -> ()
```
Swaps the positions of the view models at `index1` and `index2`.
```lua highlight={5}
function swapItems(menu: PropertyList, index1: number, index2: number)
local highestIndex = math.max(index1, index2)
if menu and menu.length >= highestIndex then
menu:swap(index1, index2)
end
end
```
### `pop`
{/* function pop(self): ViewModel? */}
```lua
pop() -> ViewModel?
```
Removes and returns the last view model in the list.
```lua highlight={3}
function handlePop(self: MenuListController)
if self.menu then
self.menu:pop()
end
end
```
### `shift`
{/* function shift(self): ViewModel? */}
```lua
shift() -> ViewModel?
```
Removes and returns the first view model in the list.
```lua highlight={2}
function handleShift(self: MenuListController)
if self.menu then
self.menu:shift()
end
end
```
### `clear`
{/* function clear(self): () */}
```lua
clear() -> ()
```
Removes all view models from the list.
```lua highlight={3}
function handleClearItems(self: MenuListController)
if self.menu then
self.menu:clear()
end
end
```
### `remove`
{/* function remove(self, viewModel: ViewModel): () */}
```lua
remove(viewModel: ViewModel) -> ()
```
Removes a view model from the list.
### `removeAllOf`
{/* function removeAllOf(self, viewModel: ViewModel): () */}
```lua
removeAllOf(viewModel: ViewModel) -> ()
```
Removes every list entry that references the given view model instance.
### `removeAt`
{/* function removeAt(self, index: number): () */}
```lua
removeAt(index: number) -> ()
```
Removes the view model at the given 1-based index from the list.