Think in terms of two tables, one for your layout and one for you contacts data and then use two different occurrences of your contacts data for both your portal and your "detail" view of the selected record in your portal.
Contacts|All::anyfield X LayoutTable::anyfield
Contacts|selected::__pkContactID = LayoutTable::_fkSelectedContact
You'll need a minimum of one record in your LayoutTable for this to work. Contacts|All and Contacts|selected are two occurrences of the same table.
On your Layout, based on the LayoutTable, add a portal to Contacts|All and it will display all contacts. You can use a different relationship or a portal filter to display subsets of your contacts, but we'll stick with all contacts in this example. THen add the fields for name, address, etc to your layout from Contacts|Selected.
Put a button in your portal row or use button Setup to turn your fields in the portal row into a button. Set it to perform this script:
Set Field [LayoutTable::_fkSelectedContact ; Contacts|All::__pkContactID ]
That should be it. If you don't see the detail view fields automatically updating, try adding a refresh window script step to the above one step script.
For an explanation of the notation that I am using, see the first post of: Common Forum Relationship and Field Notations Explained
Brilliant! Thank you - works great