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(){
@Override
public void handleMessage(Message msg) {
// process incoming messages here
super.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(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (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() {
@Override
public void onTop() {
// TODO Auto-generated method stub
Log.d(tag,"------滾動到最上方------");
}
@Override
public void onScroll() {
// TODO Auto-generated method stub
Log.d(tag,"沒有到最下方,也不是最上方");
}
@Override
public void onBottom() {
// TODO Auto-generated method stub
Log.d(tag,"------滾動到最下方------");
}
});
感激我吧,我嘔心瀝血纔出來了這麼個類。呵呵。
順便記一下老外使用fullScroll的做法。當然也可以直接fullScroll而不需要放入post()。
scrollView.post(new Runnable() {
@Override
public void run() {
scrollView.fullScroll(View.FOCUS_DOWN);
}
});