reference to : http://blog.csdn.net/welovesunflower/article/details/7926512
工作中遇到一个需求,对ListView某一项操作后刷新ListView,但是如果直接刷新,界面上ListView从第一列开始显示,用户体验不好,于是在网上搜了一些恢复LIstView滑动位置的方法。解决办法如下:
1 :
// 设置ListView到记录的位置 mListView.setSelection(mPosition); mListView.setOnScrollListener(new OnScrollListener() { // 滚动状态改变时调用 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // 不滚动时保存当前滚动到的位置 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { mPosition = mListView.getFirstVisiblePosition(); } } // 滚动时调用 @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } });
2:
//给ListView设置监听器 backgroundList.setOnScrollListener(scrollListener); private OnScrollListener scrollListener = new OnScrollListener() { @Override public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) { } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { // scrollPos记录当前可见的List顶端的一行的位置 scrollPos = myList.getFirstVisiblePosition(); } if (arrayList != null) { View v=myList .getChildAt(0); scrollTop=(v==null)?0:v.getTop(); } } }; 调用setAdapter之后恢复位置: myList .setSelectionFromTop(scrollPos, scrollTop);