android ListView/GridView與ScrollView巢狀的滑動衝突解決
阿新 • • 發佈:2019-01-29
首先說一下思路,主要就是去掉子ListView/GridView的內容全部顯示出來,使其不需要滑動。然後用ScrollView將其包裹在其中,接管滑動事件,達到整個佈局的滑動效果。
實際做法需要將ListView/GridView 與 ScrollView 覆寫 幾個方法。(自定義一個繼承於原控制元件的View)
貼程式碼:
ScrollView 改寫方法:
private static final String TAG = "ScrollviewEdit";
private ScrollView parent_scrollview;
int currentY;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (parent_scrollview == null) {
return super.onInterceptTouchEvent(ev);
} else {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 將父scrollview的滾動事件攔截
currentY = (int) ev.getY();
setParentScrollAble(false );
return super.onInterceptTouchEvent(ev);
} else if (ev.getAction() == MotionEvent.ACTION_UP) {
// 把滾動事件恢復給父Scrollview
setParentScrollAble(true);
} else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
}
}
return super.onInterceptTouchEvent(ev);
}
/**
* 是否把滾動事件交給父scrollview
*
* @param flag
*/
private void setParentScrollAble(boolean flag) {
parent_scrollview.requestDisallowInterceptTouchEvent(!flag);
}
其餘方法不變。
注:
android:focusable=”true”
android:focusableInTouchMode=”true”
用這兩行屬性給子LinearLayout也能搞定scrollview
不過不知道會不會出現一些奇怪的效果。
GridView/ListView:
改寫其onMeasure方法使其顯示全部內容,以禁用其滑動。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
控制元件呼叫:
用包名呼叫自己的控制元件,屬性不變,程式碼不變。(無需修改程式碼中原來ListView/GridView的型別,用其父類即可)