I tried to set the 'layout' of a (custom)listview resp. their column widths (save and restore those widths) and did run into trouble.
Saw that happened already with an older Delphi - LCL and VCL listviews are based on a Windows control.
There are already some threads around, here as well as in stackoverflow etc., also bugs are mentioned in the latter, dealing with a failure of belonging api calls. Nothing specific to the LCL so far.
Note that in (custom) listview the column widths are normally set near around CreateWnd, and attempts to modify them later do fail. - Anyhow there must be a check if the columns had been created before to set appropriate widths.
if bColumnsCreated then begin
Columns[0].Width := FColWidth_Name; // <<<<<<<<< will have no effect
// Fortunately here there is a workaround possible:
SendMessage(Handle,LVM_SETCOLUMNWIDTH,0, FColWidth_Name); // The setter must take care this code is called after the column's creation
end;
Ok so far, although it's quite counter intuitive that one cannot set the width directly
(without going a bypase like: set ViewStyle to vsList, and then to vsReport again).
But - for to remember the layout - at least the retrieval of a current column's width is easy?
Width_0 := Columns[0].Width; // Surprise, 'Width_0' will have unchanged the value that was used at the column's creation time
Width_0 := SendMessage(myListView.Handle, LVM_GETCOLUMNWIDTH, 0, 0); // Last parameter is unused
// Result value: 0
Width_0 := ListView_GetColumnWidth(myListView.Handle, 0);
// Result value: 0
Width_0 := ListView_GetColumnWidth(myListView.Handle, myListView.Columns[0].Index);
// Result value: 0
And now? How to store a layout when the user has resized a column and one cannot determine the current width?

After some irritations, why such an API call isn't reliable i had the idea for a crude hack-around (which seems to work).
Before i mention this, i'd like to ask: ==> am i on the wrong road ??