IT_Programming/Android_Java

[펌] ListView 스크롤 위치 저장 및 복원

JJun ™ 2015. 10. 27. 07:12



 출처

 : http://bwoh.tistory.com/54

 : http://nicelee.egloos.com/m/3027648

 : http://acholyte.tistory.com/entry/ListView-스크롤-위치-저장-및-복구



(안에 든거는 뭐냐구요?.. 아마 항암제...)



ListView를 일정 시간 간격으로 재로딩할 경우 스크롤 위치를 저장하고 복원할 필요가 있다.


1
2
3
4
5
6
7
8
9
10
11
private void getListScrollInfo() {
        mPosition = mList.getFirstVisiblePosition();
         
        View v = mList.getChildAt(0);
        if(v != null)
            mScrollY = (int) v.getTop();
        else
            mScrollY = 0;
         
        Log.i("mPosition", "" + mPosition + "," + mScrollY);
}

1
2
3
mList.setAdapter(adapter);
 
mList.setSelectionFromTop(mPosition, mScrollY);



Fragment에서 사용하는 예제~~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    @Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
     
    getListScrollInfo();
    outState.putInt("position", mPosition);
    outState.putInt("scrolly", mScrollY);
}
 
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);
    if (savedInstanceState != null) {
        mPosition =  savedInstanceState.getInt("position");
        mScrollY =  savedInstanceState.getInt("scrolly");
    }
}



list의 scroll 위치 지정하기


setSelection(int position) 을 사용하면 원하는 position으로 scroll이 이동한다.

리스트 뷰 생성시 무조건 제일 아래로 스크롤이 이동하는 것 같다.


android:stackFromBottom="true"

android:transcriptMode="alwaysScroll"







ListView 스크롤 위치 저장 및 복구



출처: http://stackoverflow.com/questions/3014089/maintain-save-restore-scroll-position-when-returning-to-a-listview


위의 링크의 두 번째 답변을 참고하여 다음과 같은 소스를 작성하면 된다.



Parcelable state; // 상태 저장 변수

 

...

 

public void onPause() {

    state = listView.onSaveInstanceState(); // 리스트뷰 스크롤 위치 저장

}

 

public void onResume() {

    if (state != null) { // 리스트뷰 상태가 있는 경우

        listView.onRestoreInstanceState(state); // 리스트뷰 스크롤 위치 복구

    }

}