Что то я не понял в чем проблема у автора.  Стандартный метод сортировки работает (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).