欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NoScrollViewPager解决嵌套listView依然可以滑动的问题

程序员文章站 2022-06-17 19:13:40
...

最近项目中有个需求,使用ViewPager嵌套Fragment,有的Fragment中有listView,ViewPager不可以进行滑动。开始只是重写它的onInterceptHoverEvent与onTouchEvent方法,使之返回false。但是不是这么简单,我们依然可以发现在有listView以及类似的列表控件时,都会让ViewPager有顿顿的滑动效果。并不是屏蔽它的事件分发与处理就可以解决。

于是我简单的下ViewPager的源码,发现scrollTo这个方法不止会在onTouchEvent中进行调用,在其他方法中也会有调用,如setCurrentItemInternal中也会调用。于是我就想会不会因为这个而影响了,我便重写了scrollTo方法,并做了判断,果然有效

上code

public class NoScrollViewPager extends ViewPager {
    private static final String TAG = "NoScrollViewPager";
    private int mWith;

    public NoScrollViewPager(Context context) {
        super(context);
        initData();
    }

    public NoScrollViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        initData();
    }

    private void initData() {
        int[] screenWithAndHeight = ScreenUtils.getScreenWithAndHeight((Activity) getContext());
        mWith = screenWithAndHeight[0];
    }

    @Override
    public boolean onInterceptHoverEvent(MotionEvent event) {
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return false;
    }

    @Override
    public void scrollBy(int x, int y) {
        Log.e(TAG, "scrollBy");
        super.scrollBy(x, y);
    }

    @Override
    public void scrollTo(int x, int y) {
        Log.e(TAG, "scrollTo-x=" + x);
        Log.e(TAG, "scrollTo-y=" + y);
        if (x % mWith != 0) {
            return;
        }
        super.scrollTo(x, y);
    }

    @Override
    public void setCurrentItem(int item) {
        super.setCurrentItem(item, false);
    }
}