OK, it's a two year old thread, but maybe someone else will need this info one day...
I've found the best answer to this (for me) is the following:
//save scroll position
int idx = listView.Items.IndexOf(listView.TopItem);
...
//restore vertical scroll position (if records were added or deleted things may get weird)
try
{
listView.TopItem = listView.Items[idx];
}
catch (Exception ex)
{
Debug.WriteLine("Error restoring scroll position: "+ ex.Message);
}
The LockWindowUpdate function is cool -- it totally eliminates the flash when I clear/refill the listview.