解决ListView在ScrollView中加载完成后,界面直接滚动到ListView的位置的办法【已测试,很好用】

最近在写一个程序界面,有一个scrollVIew,其中有一段内容是需要在线加载的。

当内容加载完成后,ScrollView中内容的长度会发生改变,这时ScrollView会自动下滚,如下图所示:

解决ListView在ScrollView中加载完成后,界面直接滚动到ListView的位置的办法【已测试,很好用】

滚动的那一下体验特别不好,所以要防止这种情况。即不论Scrollview中内容如何,都要保持在最上。


解决办法:

方式一:绝大部分时候都可以通过这种方式解决

先简单写一下我的xml文件的结构:

[html] view plaincopy
  1.  <ScrollView  
  2.         android:id="@+id/scrollView1"  
  3.         android:layout_width="fill_parent"  
  4.         android:layout_height="fill_parent"  
  5.         android:layout_alignParentLeft="true"  
  6.         android:layout_below="@+id/linearLayout2"  
  7.         android:background="@drawable/repeat_bg"  
  8.         android:paddingBottom="5dp" >  
  9.   
  10.         <LinearLayout  
  11.             android:layout_width="match_parent"  
  12.             android:layout_height="match_parent"  
  13.             android:orientation="vertical"  
  14.             android:paddingLeft="10dp"  
  15.             android:paddingRight="10dp"  
  16.             android:focusable="true"  
  17.             android:focusableInTouchMode="true"     
  18.             android:paddingTop="15dp" >  
  19. <!-- 上面这两行是控制scrollview   
  20.             android:focusable="true"  
  21.             android:focusableInTouchMode="true"     
  22. 不自动的关键! !-->  
  23.   
  24.   
  25.             <LinearLayout  
  26.                 android:layout_width="match_parent"  
  27.                 android:layout_height="wrap_content"  
  28.                 android:orientation="vertical" >  
  29.   
  30.                 <ListView  
  31.                     android:id="@+id/lv_gc"  
  32.                     android:layout_marginTop="5dp"  
  33.                     android:layout_width="match_parent"  
  34.                     android:layout_height="20dp"  
  35.                     android:background="#aaffffff"  
  36.                     android:divider="#666"               
  37.                     android:scrollbars="none|vertical" >  
  38.   
  39.                 </ListView>  
  40.   
  41.             </LinearLayout>  
  42.         </LinearLayout>  
  43. </ScrollView>  

如上面代码,我的ScrollView中第一个内容是LinearLayout,下面有一个LinearLayout包裹着的ListView.ListView是长度可变的。

将LinearLayout中加入代码:

[html] view plaincopy
  1. android:focusable="true"  
  2. android:focusableInTouchMode="true"   
问题即可解决,欢迎大家交流。

转载请注明来自:http://blog.csdn.net/icyfox_bupt/article/details/15026299



方式二:当方式一不管用的时候,试试这种方式[已测试,可用]

重写ScrollView的该方法



[html] view plain copy
  1. //解决ScrollView内嵌套的ListView加载完数据后,自动滚动ListView所在位置的问题。  
  2. @Override  
  3. protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {   
  4.     return 0;  
  5. }  

[html] view plain copy
  1. /**  
  2.  * 能够兼容ViewPager的ScrollView 解决了ViewPager在ScrollView中的滑动反弹卡顿问题  
  3.  *   
  4.  * @author    
  5.  *   
  6.  */  
  7. public class ScrollViewExtend extends ScrollView {  
  8.     // 滑动距离及坐标  
  9.     private float xDistance, yDistance, xLast, yLast;  
  10.   
  11.     public ScrollViewExtend(Context context, AttributeSet attrs) {  
  12.         super(context, attrs);  
  13.     }  
  14.   
  15.     @Override  
  16.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  17.         switch (ev.getAction()) {  
  18.         case MotionEvent.ACTION_DOWN:  
  19.             xDistance = yDistance = 0f;  
  20.             xLast = ev.getX();  
  21.             yLast = ev.getY();  
  22.             break;  
  23.         case MotionEvent.ACTION_MOVE:  
  24.             final float curX = ev.getX();  
  25.             final float curY = ev.getY();  
  26.   
  27.             xDistance += Math.abs(curX - xLast);  
  28.             yDistance += Math.abs(curY - yLast);  
  29.             xLast = curX;  
  30.             yLast = curY;  
  31.   
  32.             if (xDistance > yDistance) {  
  33.                 return false;  
  34.             }  
  35.         }  
  36.   
  37.         return super.onInterceptTouchEvent(ev);  
  38.     }  
  39.   
  40.     //解决ScrollView内嵌套的ListView加载完数据后,自动滚动ListView所在位置的问题。  
  41.     @Override  
  42.     protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {   
  43.         return 0;  
  44.     }  
  45.   
  46. }