精确记录和恢复ListView滑动位置

工作中遇到一个需求,对ListView某一项操作后刷新ListView,但是如果直接刷新,界面上ListView从第一列开始显示,用户体验不好,于是在网上搜了一些恢复LIstView滑动位置的方法。解决办法如下:

[java]  view plain copy
  1. //给ListView设置监听器  
  2. backgroundList.setOnScrollListener(scrollListener);  
  3. private OnScrollListener scrollListener = new OnScrollListener() {  
  4.    
  5.                 @Override  
  6.                 public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {  
  7.                 }  
  8.    
  9.                 @Override  
  10.                 public void onScrollStateChanged(AbsListView view, int scrollState) {  
  11.                         if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {  
  12.                                 // scrollPos记录当前可见的List顶端的一行的位置   
  13.                                scrollPos = myList.getFirstVisiblePosition();   
  14.                         }  
  15.                         if (arrayList != null) {    
  16.               View v=myList .getChildAt(0);  
  17.               scrollTop=(v==null)?0:v.getTop();  
  18.             }    
  19.          }  
  20.         };  
  21.   
  22. 调用setAdapter之后恢复位置:  
  23. myList .setSelectionFromTop(scrollPos, scrollTop);  

 

参考:http://stackoverflow.com/questions/3014089/scroll-to-a-position-in-a-listview 


之前在网上搜到的,有另外两种方法
第一种:
在onScrollStateChanged里面 

scrolledX = listView.getScrollX(); 

 scrolledY = listView.getScrollY(); 

恢复时使用listView.scrollTo(scrolledX, scrolledY); 

 但是得到的scrolledY为0
第二种:
在onScrollStateChanged里面

position = listView.getFirstVisiblePosition(); 

用position记录显示在屏幕顶端的一个item,

恢复时使用listView.setSelection(position); 

但是这种方法不够精确
最后用setSelectionFromTop实现的

你可能感兴趣的:(精确记录和恢复ListView滑动位置)