RadListView Item Reorder
Reordering items in a list is a common scenario in mobile apps. For example, a list view visualizing tasks can allow reordering the tasks to specify their priority. RadListView allows you to enable this functionality by setting a single property.
Enabling Item Reorder
To enable the item-reorder function in your RadListView, simply
set the
itemReorder
property as shown below. Additionally, you can subscribe for the
itemReorderedEvent
event to listen for reorder events:
Example 1: Enabling Item Reorder on RadListView:
<lv:RadListView itemReordered="{{onItemReordered}}" items="{{ dataItems }}" row="1" itemReorder="true">
<lv:RadListView.itemTemplate>
<StackLayout paddingTop="5" paddingBottom="5">
<Label fontSize="20" text="{{ itemName }}" marginLeft="10"/>
</StackLayout>
</lv:RadListView.itemTemplate>
</lv:RadListView>
Defining Reorder Mode
RadListView
supports two reorder modes:
-
HoldAndDrag
- items are reordered by holding and dragging them -
Drag
- items are reordered by simply dragging them
The default reorder mode is
HoldAndDrag
. To activate one of the available reorder modes set the
reorderMode
property to the corresponding value.
Defining a Reorder Handle
When the
Drag
reorder mode is activated
RadListView
behaves as follows:
- iOS: a reorder handle is displayed at the right side of the item. Dragging the item by the handle will reorder it.
- Android: now handle is displayed. Dragging the item at any place will reorder it.
You can easily customize the reorder handle by explicitly
designating which part of your
itemTemplate
will serve as a reorder handle. Take a look at the following XML
snippet:
Example 2: Defining a Reorder Handle in your template:
<lv:RadListView.itemTemplate>
<GridLayout columns="*, auto" paddingTop="16" paddingBottom="16">
<StackLayout orientation="vertical" col="0" verticalAlignment="center">
<Label fontSize="20" text="{{ itemName }}"/>
</StackLayout>
<lv:ReorderHandle col="1" verticalAlignment="center">
<Image android:src="res://reorder_icon" ios:src="res://reorder-icon" stretch="none" verticalAlignment="stretch" margin="16"/>
</lv:ReorderHandle>
</GridLayout>
</lv:RadListView.itemTemplate>
As you can see a special
ReorderHandle
element is used which instructs
RadListView
which part of the template should be used as a reorder handle.
The
ReorderHandle
element is a regular {N} view so you can use all familiar
properties to adjust its layout and appearance. Here, an
Image
element is put inside the
ReorderHandle
. The following pictures demonstrate how
RadListView
looks like in this case:
Figure 1: Item Reorder with a custom reorder handle in action:
Handling the Item Reorder Events
RadListView
exposes two events related to the item reorder functionality:
-
itemReorderStartingEvent
- fired before an item is reordered. Exposes an instance of theListViewEventData
class which contains the index of the item being reordered. Setting thereturnValue
property of this instance tofalse
can be used to cancel the reordering procedure -
itemReorderStartedEvent
- fired when the reordering is about to start. No indices are changed at this point -
itemReorderedEvent
- fired after an item has been reordered. Indices are now updated.
The
itemReorderStartedEvent
event exposes an instance of the
ListViewEventData
class which you can use to obtain the index of the item about to
be reordered.
RadListView fires the
itemReorderedEvent
event once an item has been reordered. The event supplies you
with a
ListViewEventData
instance which data
property points to a
ListViewItemReorderData
ListViewItemReorderData
object. It exposes two properties giving you specific
information about the reorder operation:
-
targetIndex
- indicates the destination of the reordered item -
targetGroupIndex
- indicates the target data group of the reordered item if present
The following code snippet demonstrates and example of a
itemReorderedEvent
handler:
Example 3: Handling item reorder events:
public onItemReordered(args: ListViewEventData) {
console.log("Item reordered. Old index: " + args.index + " " + "new index: " + args.data.targetIndex);
}
References
Want to see this scenario in action? Check our SDK examples repo on GitHub. You will find this and many other practical examples with NativeScript UI.