ScrollView滑動到最底端或者最頂端再載入資料

來源:互聯網
上載者:User

要實現一個功能:當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,"------滾動到最下方------");}});

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.