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.

Related reading