1. 程式人生 > >ListView,GridView和ScrollVIew巢狀實現上拉載入更多

ListView,GridView和ScrollVIew巢狀實現上拉載入更多

這個問題找了好幾天,網上沒有直接的答案,今天寫在這裡希望能幫到人,剛寫部落格,樣式什麼的就不看了,簡單易懂好貼上才是你們需要的!

不對的地方請在評論指正,謝謝!

首先說下ListView,GridView和ScrollVIew巢狀問題,自定義一個ListView或GridView,重寫onMeasure()方法兩行程式碼解決問題

@Override  
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
	// TODO 自動生成的方法存根  
        int expandSpec = MeasureSpec.makeMeasureSpec(   
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);   
        super.onMeasure(widthMeasureSpec, expandSpec);   
}  
程式碼使用直接貼上就OK 這個程式碼解決了巢狀滑動衝突的問題,原理是這個程式碼禁用了ListView或GridView本身的滑動功能,強制它們的item全部顯示。 那麼問題來了:ListView的滑動監聽怎麼辦?上拉載入呢? 答案是:沒有滑動,監聽無效,因此你想實現上拉載入需要靠ScrollView的滑動監聽來做。 但ScrollView本身是沒有監聽事件的,所以,你只能自定義了。 在ScrollView中有個方法,onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) 這個方法有四個引數 這個方法是沒有暴露出來的所以需要自己寫個介面呼叫在自定義ScrollView中新增以下方法
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
	super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
        if (scrollY>0&&onScrollToBottomListener!=null){
            onScrollToBottomListener.onScrollBottomListener(clampedY);
        }
}

public void setOnScrollToBottomLintener(OnScrollToBottomListener listener){
         onScrollToBottomListener = listener;
}

public interface OnScrollToBottomListener {
        void onScrollBottomListener(boolean isBottom);
}
然後在用的地方呼叫就可以 沒有原始碼,沒有Demo,你需要的只是Ctrl+C和Ctrl+V。