Maintain/Save/Restore scroll position when returning to a ListView

后端 未结 20 1635
無奈伤痛
無奈伤痛 2020-11-21 21:30

I have a long ListView that the user can scroll around before returning to the previous screen. When the user opens this ListView again, I want the

20条回答
  •  隐瞒了意图╮
    2020-11-21 22:11

    CAUTION!! There is a bug in AbsListView that doesn't allow the onSaveState() to work correctly if the ListView.getFirstVisiblePosition() is 0.

    So If you have large images that take up most of the screen, and you scroll to the second image, but a little of the first is showing, the scroll position Won't be saved...

    from AbsListView.java:1650 (comments mine)

    // this will be false when the firstPosition IS 0
    if (haveChildren && mFirstPosition > 0) {
        ...
    } else {
        ss.viewTop = 0;
        ss.firstId = INVALID_POSITION;
        ss.position = 0;
    }
    

    But in this situation, the 'top' in the code below will be a negative number which causes other issues that prevent the state to be restored correctly. So when the 'top' is negative, get the next child

    // save index and top position
    int index = getFirstVisiblePosition();
    View v = getChildAt(0);
    int top = (v == null) ? 0 : v.getTop();
    
    if (top < 0 && getChildAt(1) != null) {
        index++;
        v = getChildAt(1);
        top = v.getTop();
    }
    // parcel the index and top
    
    // when restoring, unparcel index and top
    listView.setSelectionFromTop(index, top);
    

提交回复
热议问题