Scrollview+ListView衝突解決

最近作一個功能,要使用Scrollview+Listview+ ListView,,通過找demo,找到了一個例子,本身也實現了一個例子來理解實現過程。先分享下,望你們指點、java

 思路 :ide

        如今又scrollview,一個上面的listView 咱們叫作topListView, 一個在下面的GridView 咱們叫作bottomListView, 我讓topListView重寫onMeasure()方法,讓topListView徹底顯示,再也不具備滾動功能。post

 

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, expandSpec);
}


   這樣topListview和ScrollView衝突問題得以解決。spa

   bottomListView和Scrollview和衝突咱們經過如下解決:咱們給tottomListView設置一個固定高度,這個高度每每是ScrollView顯示的高度,這樣解決了顯示的問題。code

post(new Runnable() {
    @Override
    public void run() {

        int height = mScrollView.getHeight();
        int height2 = topLayout.getHeight();
        Log.i("TEST", " post ---> height : " + height);
        Log.i("TEST", " post ---> height2 : " + height2);
        Log.i("TEST", " post ---> getHeight : " + rootView.getHeight());

        recommendGrid.getLayoutParams().height = height;
        recommendGrid.setSwitchHeight(height2);

        recommendGrid.invalidate();
        mScrollView.invalidate();

       
    }
}, 200);

其次是滑動的衝突,衝突的關鍵是listView和Scrollview放在一塊兒時listVIew接收不到屏幕的touch事件,解決它。事件

咱們的解決方法是: 當Scrollview向上滾動時當滾動到topListView和bottom的分界點,即bottomListView滾動到屏幕頂端,咱們就主動將touch叫給bottomListView,因此上面代碼同時設置了topLIstView的高度。get

recommendGrid.setSwitchHeight(height2);

而後判斷 it

mScrollView.setOnMyScrollListener(new PullScrollView.OnMyScrollListener() {
    @Override
    public void onScroll(int l, int t, int oldl, int oldt) {
        if (recommendGrid.isOnTop()) {
            recommendGrid.setParentIdle(true);
        } else {
            recommendGrid.setParentIdle(false);
        }
    }
});

其中 io

recommendGrid.setParentIdle();

用來設置父scrollView是否接收touch事件,true :不接收,即傳給子元素ListView,false : 相反,內部方法是:class

public void setParentIdle(boolean flag) {
    if (parentView != null) {
        parentView.requestDisallowInterceptTouchEvent(flag);
    }
}

下滑時,須要將touch事件控制權再交給ScrollView,這時須要判斷,當bottom的第一個元素徹底展現出來時才能夠將控制權移交,

private boolean isFirstItemOnTop() {

    boolean flag = getFirstVisiblePosition() == 0 && getChildCount() > 0 && getChildAt(0).getTop() >= 0;

    Log.d("TEST", " isFirstItemOnTop ---> getFirstVisiblePosition : " + (getFirstVisiblePosition() == 0));
    if (getChildCount() > 0) {

        Log.d("TEST", " isFirstItemOnTop ---> getChildAt(0).getTop() : " + getChildAt(0).getTop());
    }
    return flag;
}

ok,基本思路在這裏,具體代碼整理後在上傳,謝謝。


PS :   因爲topListView是徹底展現,因此getView()不會再被重用,且會重複執行不少次,因此不建議用來實現每一個itemView特別複雜的功能,其實上面徹底能夠將topListView替換掉,用任一ViewGroup來實現其餘功能,方法仍是同樣的。

相關文章
相關標籤/搜索