要實現一個功能:當Scrollview滑動到最底端的時候需要觸發事件載入其他資料。很多人都以為ScrollView可以像ListViev那樣setOnScrollListener,其實沒那麼簡單,因為ScrollView壓根就沒有該介面,在baidu上兜了一圈沒有找到合適的答案,沒辦法只能google去了,居然一下子解決了這個問題,還是老外比較牛,呵呵,這是我訪問的網址:
http://stackoverflow.com/questions/2864563/how-do-i-know-that-the-scrollview-is-already-scrolled-to-the-bottom
注意,如果資料不滿一頁的話,會執行onBottom方法!通常要使用懶載入的話資料都會超過一頁,所以我沒仔細考慮這個問題!
我把ScrollView封裝成類了,源碼如下:
package com.ql.view;import android.content.Context;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.ScrollView; public class LazyScrollView extends ScrollView{private static final String tag="LazyScrollView";private Handler handler;private View view;public LazyScrollView(Context context) {super(context);// TODO Auto-generated constructor stub}public LazyScrollView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public LazyScrollView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}//這個獲得總的高度public int computeVerticalScrollRange(){return super.computeHorizontalScrollRange();}public int computeVerticalScrollOffset(){return super.computeVerticalScrollOffset();}private void init(){this.setOnTouchListener(onTouchListener);handler=new Handler(){ @Overridepublic void handleMessage(Message msg) {// process incoming messages heresuper.handleMessage(msg);switch(msg.what){case 1:if(view.getMeasuredHeight() <= getScrollY() + getHeight()) {if(onScrollListener!=null){onScrollListener.onBottom();}}else if(getScrollY()==0){if(onScrollListener!=null){onScrollListener.onTop();}}else{if(onScrollListener!=null){onScrollListener.onScroll();}}break;default:break;}} };} OnTouchListener onTouchListener=new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubswitch (event.getAction()) {case MotionEvent.ACTION_DOWN:break;case MotionEvent.ACTION_UP:if(view!=null&&onScrollListener!=null){handler.sendMessageDelayed(handler.obtainMessage(1), 200);}break;default:break;}return false;} }; /** * 獲得參考的View,主要是為了獲得它的MeasuredHeight,然後和捲軸的ScrollY+getHeight作比較。 */ public void getView(){ this.view=getChildAt(0); if(view!=null){ init(); } } /** * 定義介面 * @author admin * */ public interface OnScrollListener{ void onBottom(); void onTop(); void onScroll(); } private OnScrollListener onScrollListener; public void setOnScrollListener(OnScrollListener onScrollListener){ this.onScrollListener=onScrollListener; }}
用的時候也很簡單,通常這樣使用:
scrollView=(LazyScrollView)findViewById(R.id.scrollView); scrollView.getView(); scrollView.setOnScrollListener(new OnScrollListener() {@Overridepublic void onTop() {// TODO Auto-generated method stubLog.d(tag,"------滾動到最上方------");}@Overridepublic void onScroll() {// TODO Auto-generated method stubLog.d(tag,"沒有到最下方,也不是最上方");}@Overridepublic void onBottom() {// TODO Auto-generated method stubLog.d(tag,"------滾動到最下方------");}});