Android-精确记录恢复ListView的item位置

时间:2021-12-06 06:23:50

    项目中经常会遇到需要记录恢复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);