ListView和ScrollView嵌套解決滑動衝突問題

首先,說明一下,我這裏的ListView和ScrollView都是上下滑動的,如果是左右滑動,雖然差距不大,但就不能直接生搬硬套了。

1.解決ListView和ScrollView嵌套滑動衝突問題

當ListView放在ScrollView的佈局中間,直接實現ListView的setOnTouchListener就可以了

listView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                scrollView.requestDisallowInterceptTouchEvent(true);
                return false;
            }
        });

如此一來,當點擊在ListView的時候,就可以正常使用ListView的滑動了

2.ListView滑動到最頂部的時候,ScrollView自動接手繼續向上滑動

當ListView滑動到最頂部的時候,我們在ListView裏繼續滑動,會一直卡在ListView裏,要想讓ScrollView自動接手繼續向上滑動,只要在setOnScrollListener里加上這個判斷就可以了
 

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                //判斷ScrollView是否不滑動了,判斷ListView是否已顯示第一個Item了
                if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && view.getFirstVisiblePosition() == 0){
                    //允許即使在ListView滑動,ScrollView也可以滑動
                    scrollView.requestDisallowInterceptTouchEvent(false);
                    //scrollView滑動,滑動距離爲ListView滑動距離
                    scrollView.smoothScrollBy(listView.getScrollX(), listView.getScrollY());
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                //empty
            }
        });

3.當ListView在ScrollView的最底部時,ListView完全顯示才允許滑動

這個就是在最開始的setOnTouchListener里加上判斷就好了
 

listView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //scrollView.getScrollY()超出屏幕的高度
                //scrollView.getHeight()屏幕顯示的高度
                //scrollView.getPaddingTop(),scrollView.getPaddingBottom()//上下Padding
                //scrollView.getChildAt(0).getHeight()//scrollView唯一子View的高度
                if(scrollView.getScrollY() + scrollView.getHeight() - scrollView.getPaddingTop() - scrollView.getPaddingBottom() == scrollView.getChildAt(0).getHeight()){
                    scrollView.requestDisallowInterceptTouchEvent(true);
                }
                return false;
            }
        });

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章