Webviewの読み込みページ最後尾を判定する(Android)

WebViewで読み込まれたページの最後尾までスクロールした時の判定方法です。

まずはWebviewを継承した独自Webviewを作成します。

public class WebViewEx extends WebView{
    public WebViewEx(final Context context)
    {
        super(context);
    }
    public WebViewEx(final Context context, final AttributeSet attrs)
    {
        super(context, attrs);
    }
    public WebViewEx(
    	final Context context, final AttributeSet attrs, final int defStyle)
    {
        super(context, attrs, defStyle);
    }
}

Scroll用のcallback interfaceを作成します

    public static interface OnScrollCallback
    {
        public void onScroll(int l, int t);   // スクロールした
        public void onScrolledEnd();        // 最後尾までスクロールした
    }

作成したinterfaceをWebViewExに持たせてsetterを用意

public class WebViewEx extends WebView{
	// 上述したコンストラクタを省略
    private OnScrollCallback mOnScrollCallback;
	public void setOnScrollCallback(final OnScrollCallback onScrollCallback){
    	this.mOnScrollCallback = onScrollCallback;
    }
}

onScrollChangedをoverrideする

public class WebViewEx extends WebView{
	// 省略
    @Override
    protected void onScrollChanged(
    	final int l, final int t, final int oldl, final int oldt)
    {
        super.onScrollChanged(l, t, oldl, oldt);
        // スクロールCallbackを呼び出す
        if (mOnScrollCallback != null){
       		mOnScrollCallback.onScroll(l, t);
            
            // 最後尾まで行ったか判定する
            int pageHeight = computeVerticalScrollRange();
			if (pageHeight <= t+computeVerticalScrollExtent()){
            	// 最後尾までスクロールしたことを知らせる
            	mOnScrollCallback.onScrolledEnd();
			}
        }
    }
}

最終的に独自Webviewはこうなります

public class WebViewEx extends WebView{
    public WebViewEx(final Context context)
    {
        super(context);
    }
    public WebViewEx(final Context context, final AttributeSet attrs)
    {
        super(context, attrs);
    }
    public WebViewEx(
    	final Context context, final AttributeSet attrs, final int defStyle)
    {
        super(context, attrs, defStyle);
    }
    private OnScrollCallback mOnScrollCallback;
	public void setOnScrollCallback(final OnScrollCallback onScrollCallback){
    	this.mOnScrollCallback = onScrollCallback;
    }
    // スクロールインターフェース
    public static interface OnScrollCallback
    {
        public void onScroll(int l, int t);   // スクロールした
        public void onScrolledEnd();       // 最後尾までスクロールした
    }
    @Override
    protected void onScrollChanged(
    	final int l, final int t, final int oldl, final int oldt)
    {
        super.onScrollChanged(l, t, oldl, oldt);
        // スクロールCallbackを呼び出す
        if (mOnScrollCallback != null){
        	mOnScrollCallback.onScroll(l, t);
            // 最後尾まで行ったか判定する
            int pageHeight = computeVerticalScrollRange();
			if (pageHeight <= t+computeVerticalScrollExtent()){
            	// 最後尾までスクロールしたことを知らせる
            	mOnScrollCallback.onScrolledEnd();
			}
        }
    }    
}

使い方はこんな感じです。

	WebviewEx webview = (WebviewEx)view.findViewById(R.id.webview);
    webview.setOnScrollCallback(new WebViewEx.OnScrollCallback() {
            @Override
            public void onScroll(int l, int t) {
                // scrolling now !!
            }
            @Override
            public void onScrolledEnd() {
				// scrolled end !!
            }
    });