It appears you can programatically scroll a ListView from here:
For a direct / smooth scroll respectively:
getListView().setSelection(21);
getListView().smoothScrollToPosition(21);
In the getView method of the ListView you can record the position of the last View rendered
@Override
public View getView(int position, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
Thus, when you reset your listview, you can scroll to the previous position the user was at, by keeping just an integer record of their scroll position.
I realize you're also considering a fragment solution. I know that the "replace" methods cause the replaced fragment to destroy it's view (at least that's how "support" fragments handle it). Thus in that scenario, you're still returning to a listview that's lost its scrolled state. You may try hide/show fragment transactions, as they may retain their views, and hence scroll state.
If you do try the hide/show tell me the result :) If it works, I may use it myself.