项目中经常会遇到需要记录恢复ListView的item位置,今天记录一下几种可用的方法.
一.使用listView.setSelection(position); //position 要恢复的item的position值
1.给listView添加滑动监听事件
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){
itemPosition = listView.getFirstVisiblePosition();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
}
});
2.在恢复的时候调用listView.setSelection(itemPosition);就可以恢复其位置.但是这种方法有一个问题,就是不能精确恢复,比如:滚动到第三个item的一半的位置,下次恢复的时候就会将第三个item作为第一个可见的显示item'全部显示出来.
二.记录第一个可见的item的top值,使用setSelectionFromTop()精确恢复其位置
int scrollTop;
int itemPosition
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){
itemPosition = listView.getFirstVisiblePosition();
View v=listView .getChildAt(0);
scrollTop=(v==null)?0:v.getTop();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
}
});
listView.setSelectionFromTop(itemPosition , scrollTop);
三.使用listView.onRestoreInstanceState(state);也可以精确恢复listView的位置
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){
state = view.onSaveInstanceState();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
}
});
listView.onRestoreInstanceState(state);