2 ViewPager not scrolling in Android 2.3

僤鯓⒐⒋嵵緔 提交于 2019-12-01 03:59:06

You can use this ViewPager as your parent ViewPager. This allows the child ViewPager to scroll.

public class CustomViewPager extends ViewPager {

    public CustomViewPager(Context context) {
        super(context);
    }


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


    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        try {
            //Handle the issue only in lower versions of android
            if (v != this && v instanceof ViewPager && CJRAppCommonUtility.getOSVersion() < android.os.Build.VERSION_CODES.HONEYCOMB) {
                ViewPager viewPager = (ViewPager) v;
                int currentPage = viewPager.getCurrentItem();
                int size = viewPager.getAdapter().getCount();
                //if ViewPager has reached its end and if user tries to swipe left allow the parent to scroll
                if (currentPage == (size - 1) && dx < 0) {
                    return false;
                }
                //if ViewPager has reached its start and if user tries to swipe right allow the parent to scroll
                else if (currentPage == 0 && dx > 0) {
                    return false;
                } 
                //Allow the child to scroll hence blocking parent scroll
                else {
                    return true;
                }
            } 
            return super.canScroll(v, checkV, dx, x, y);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

Android developers site has a nice explanation about handling touch events in a Viewgroup. You can refer it here: http://developer.android.com/training/gestures/viewgroup.html

Hope it helps!!

In older version of Android requestDisallowInterceptTouchEvent doesn't work that great. The solution here is to extend view pager and override the onInterceptTouchEvent and store a list of children that are scrollable. Then, when onInterceptTouchEvent is called you can iterate through the list of scrollable children, get their hit rect, and see if the touch event is inside the hit rect. If it is, you can just return false to not handle it and let the child take it.

Something like this:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
    for (View view : scrollableChildren)
    {
        // get the hit rectangle for the view
        Rect rect = new Rect();
        view.getHitRect(rect);

        // check to see if the click was inside this child
        if (rect.contains((int) ev.getX(), (int) ev.getY()))
        {
            return false;
        }
    }

    return super.onInterceptTouchEvent(ev);
} 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!