ListView within fragment cant save scroll position

后端 未结 4 1084
北海茫月
北海茫月 2020-12-15 01:52

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

相关标签:
4条回答
  • 2020-12-15 02:14

    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
            );
        }
    }
    
    0 讨论(0)
  • 2020-12-15 02:14

    try

    listView.getFirstVisiblePosition()
    
    0 讨论(0)
  • 2020-12-15 02:18

    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. :)

    0 讨论(0)
  • 2020-12-15 02:38
        @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 讨论(0)
提交回复
热议问题