首先,說明一下,我這裏的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;
}
});