Quick answer: Unity UI Toolkit ListView returning stale index after drag-reorder? itemIndexChanged fires before the source is fully updated - use the new index from the event arg, not the source list.
Drag item from index 2 to index 5. Handler reads list at index 5; gets the item that was previously there.
Use the event arg
list.itemIndexChanged += (oldIdx, newIdx) => {
Reorder(source, oldIdx, newIdx);
};The event args are the truth. The source list updates after the handler.
Or rebuild on the next frame
EditorApplication.delayCall to delay the read by one frame. List is synced; reads are valid.
Avoid the auto-bind
Manual bind via makeItem/bindItem gives you control over the lifecycle. Auto-bind has timing surprises.
“List reorder events fire mid-update. Reads of the source during the handler are unreliable.”
Always use event args for ordering changes. The source-list read pattern is the trap.