I don't know if this is a bug or a feature. When an ImageList is attached to a ListView, the captions in the first column move to the right to give way to the images. Drawing images only when needed would result in a ragged left side of the 1st column which looks strange. It should also be noted that the Listview is painted essentially by the widgetset, i.e. by routines of the operating system. Therefore, the LCL cannot change this behavior.
You could try to remove the ImageList from Listview and owner-draw the column with the images in the OnCustomDrawSubItem event:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
var
R: TRect;
begin
R := Item.DisplayRectSubItem(1, drBounds); // 1 = index of image column
ImageList1.Draw(Sender.Canvas, R.Left, R.Top, Index);
end;
When doing this I faced the problem that I did not find a way how to increase the row heights of the ListView to fit the image heights. Maybe it is easy, maybe it requires system calls - I don't know...
But normally I would not use a TListView for this programming task at all. I'd use a plain old StringGrid instead which can be configured to look almost like a TListView and allows much more control. I am attaching a modified version of your demo based on a stringGrid.