ReorderableListView
A scrollable list of controls that can be reordered.
By default, each child control (from controls) is draggable using an
automatically created drag handle (see
show_default_drag_handles). To customize the draggable area, use
ReorderableDragHandle to define your own drag handle or
region.
Example:
ft.ReorderableListView(
controls=[
ft.ListTile(
title=ft.Text(f"Item {i}"),
bgcolor=ft.Colors.BLUE_GREY_300,
)
for i in range(1, 6)
],
)

Inherits: ListView
Properties
anchor- The relative position of the zero scroll offset.auto_scroller_velocity_scalar- The velocity scalar per pixel over scroll.controls- The controls displayed by thisReorderableListView.footer- A non-reorderable footer item to show aftercontrols.header- A non-reorderable header item to show beforecontrols.mouse_cursor- The cursor for a mouse pointer when it enters or is hovering over the drag handle.show_default_drag_handles- Whether to show default drag handles for eachcontrolsitem.
Events
on_reorder- Called when acontrolsitem has been dragged to a new location/position.on_reorder_end- Called when the draggedcontrolsitem is dropped.on_reorder_start- Called when acontrolsitem drag has started.
Examples
Horizontal and vertical
import flet as ft
def main(page: ft.Page):
# the primary color is the color of the reorder handle
page.theme = page.dark_theme = ft.Theme(
color_scheme=ft.ColorScheme(primary=ft.Colors.BLUE)
)
def handle_reorder(e: ft.OnReorderEvent):
# Reorder controls list to match the UI change
e.control.controls.insert(e.new_index, e.control.controls.pop(e.old_index))
def get_color(i):
return ft.Colors.ERROR if i % 2 == 0 else ft.Colors.ON_ERROR_CONTAINER
page.add(
ft.SafeArea(
expand=True,
content=ft.Column(
[ # horizontal
ft.ReorderableListView(
expand=True,
horizontal=True,
on_reorder=handle_reorder,
controls=[
ft.Container(
content=ft.Text(f"Item {i}", color=ft.Colors.BLACK),
bgcolor=get_color(i),
margin=ft.Margin.symmetric(horizontal=5, vertical=10),
width=100,
alignment=ft.Alignment.CENTER,
)
for i in range(10)
],
),
# vertical
ft.ReorderableListView(
expand=True,
on_reorder=handle_reorder,
controls=[
ft.ListTile(
title=ft.Text(f"Item {i}", color=ft.Colors.BLACK),
leading=ft.Icon(ft.Icons.CHECK, color=ft.Colors.RED),
bgcolor=get_color(i),
)
for i in range(10)
],
),
]
),
)
)
if __name__ == "__main__":
ft.run(main)

Custom drag handle
import flet as ft
def main(page: ft.Page):
def on_reorder(e: ft.OnReorderEvent):
# Reorder controls list to match the UI change
e.control.controls.insert(e.new_index, e.control.controls.pop(e.old_index))
page.add(
ft.SafeArea(
content=ft.ReorderableListView(
expand=True,
show_default_drag_handles=False,
on_reorder=on_reorder,
controls=[
ft.ListTile(
title=ft.Text(f"Draggable Item {i}", color=ft.Colors.BLACK),
leading=ft.ReorderableDragHandle(
key=f"drag_handle_{i}",
content=ft.Icon(
ft.Icons.DRAG_INDICATOR, color=ft.Colors.RED
),
mouse_cursor=ft.MouseCursor.GRAB,
),
bgcolor=ft.Colors.ERROR
if i % 2 == 0
else ft.Colors.ON_ERROR_CONTAINER,
)
for i in range(10)
],
)
)
)
if __name__ == "__main__":
ft.run(main)

Properties
anchorclass-attributeinstance-attribute
anchor: Number = 0.0The relative position of the zero scroll offset.
auto_scroller_velocity_scalarclass-attributeinstance-attribute
auto_scroller_velocity_scalar: Number | None = NoneThe velocity scalar per pixel over scroll.
It represents how the velocity scale with the over scroll distance. The auto-scroll velocity = (distance of overscroll) * velocity scalar.
controlsclass-attributeinstance-attribute
controls: list[Control] = field(default_factory=list)The controls displayed by this ReorderableListView.
When an item of this list gets reordered, the on_reorder event gets
fired, but it doesn't reorder the controls list automatically. So, to keep
controls list in sync with the UI, reorder this list inside your
on_reorder event handler. See on_reorder for an example.