首先说一下思路,主要就是去掉子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的类型,用其父类即可)