Ein Variant kann einen Integer enthalten.
Wenn man einem Variant einen Integer zuweist, dann ist der auch als Typ "Integer" im Variant gespeichert und nicht als String. (Variant kann nicht alles, was Delphi kann, aber den kann er)
Da du nur in einem Feld suchst, lass mal das Array weg und versuche es so
Delphi-Quellcode:
if tdata1.Locate('ID', Listview1.items[i].Subitems.Text, []) then
if tdata1.Locate('ID', StrToInt(Listview1.items[i].Subitems.Text), []) then