Что то я не понял в чем проблема у автора.
Стандартный метод сортировки работает (Delphi Berlin).
uses System.Generics.Defaults;
...
procedure TForm1.ButtonSortClick(Sender: TObject);
var
Comparer: IComparer<TListViewItem>;
begin
Comparer := TDelegatedComparer<TListViewItem>.Create(
function(const LeftItm, RightItm: TListViewItem): Integer
begin
Result := CompareText(LeftItm.Text, RightItm.Text);
end);
ListView1.Items.Sort(Comparer);
end;
А также можно по Data
procedure TForm1.ButtonSortClick(Sender: TObject);
var
Comparer: IComparer<TListViewItem>;
begin
Comparer := TDelegatedComparer<TListViewItem>.Create(
function(const LeftItm, RightItm: TListViewItem): Integer
begin
Result := 0; //no change
if LeftItm.Data['number'] > RightItm.Data['number'] then
Result := 1 //depend on sort order asc/desc
else if LeftItm.Data['number'] < RightItm.Data['number'] then
Result := -1; //depend on sort order asc/desc
end);
ListView1.Items.Sort(Comparer);
end;
Не забудьте BeginUpdate - EndUpdate.
Напомню что к объектам ListViewItem можно обращаться не через Data['name'], а напрямую через индексы, что гораздо быстрее, т.к. не нужно сравнивать все строки в цикле, это важно при большом количестве Objects per Item (напр. больше 5 в режиме DynamicAppearance).