1. 程式人生 > >android ListView/GridView與ScrollView巢狀的滑動衝突解決

android ListView/GridView與ScrollView巢狀的滑動衝突解決

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