4

How can I save the ListView's scroll position when the ListView is situated within a ListFragment?

Alex Lockwood
  • 81,274
  • 37
  • 197
  • 245
orchidrudra
  • 1,152
  • 1
  • 12
  • 30

4 Answers4

19

Finally I solved the problem, so I decided to post the solution for others:

Within my ListFragment sub class I declared two int variables to hold the scroll position

public static class MyListFragment extends ListFragment {

        ......................
            ......................
        private int index = -1;
        private int top = 0;
            ......................

Then override the onPause() and onResume() to save and restore the ListView's scroll positions as follows:

@Override
public void onResume() {
      super.onResume();
      ......................
      ......................
      setListAdapter(mAdapter);
      if(index!=-1){
         this.getListView().setSelectionFromTop(index, top);
      }
      ......................
      ......................

}

@Override
public void onPause() {
      super.onPause();
      try{
         index = this.getListView().getFirstVisiblePosition();
         View v = this.getListView().getChildAt(0);
         top = (v == null) ? 0 : v.getTop();
      }
      catch(Throwable t){
         t.printStackTrace();
      }
      ......................
      ......................                    
}

That's it!! I hope this will help some one. :)

orchidrudra
  • 1,152
  • 1
  • 12
  • 30
2

I think your solution is fine for touch mode but for me it wasn't enough. I needed to get the selector on the same selected item, not the first visible:

@Override
public void onStop() {
    super.onStop();
    ListView listView = this.getListView();
    lastPosition = listView.getSelectedItemPosition();
    int lastPositionInGroup = lastPosition - listView.getFirstVisiblePosition();
    lastTop = listView.getChildAt( lastPositionInGroup ).getTop();
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    /* cursor adapter stuff here */

    if (lastPosition != AdapterView.INVALID_POSITION) {
        listView.setSelectionFromTop(
                lastPosition,
                lastTop != AdapterView.INVALID_POSITION ? lastTop : 0
        );
    }
}
Andrew Barber
  • 37,547
  • 20
  • 91
  • 118
Dan Titiu
  • 21
  • 4
0
    @Override
public void onResume() 
{
      super.onResume();
      if(CommonVariables.firstsel==6)
      {
          swipelistview.setAdapter(adapter_ct);
          swipelistview.setSelection(CommonVariables.index);
      }
 }

@Override
public void onPause()
{
    super.onPause();          
    try
    {
        CommonVariables.firstsel=6;
        CommonVariables.index = Fragmentct.swipelistview.getFirstVisiblePosition()+1;       
        Toast.makeText(getActivity(),"onPause"+CommonVariables.index,1500).show();
    } 
    catch(Throwable t){
        t.printStackTrace();
     }                        
 }
0

try

listView.getFirstVisiblePosition()
Bondax
  • 3,043
  • 24
  • 35