Synchronizing two ViewPagers using OnPageChangeListener

后端 未结 6 2021
北海茫月
北海茫月 2020-12-08 22:57

I\'m trying to synchronize two ViewPagers, as apparently have quite a lot of people before me, and I\'ve got as far as this:

private ViewPager m         


        
6条回答
  •  轮回少年
    2020-12-08 23:31

    I have Solved the problem without utilizing the Listener. So you can use the listener for some other stuff and will make code look cleaner.

    I know its a question asked a long ago. I was searching for a solution and solved it myself.

    This is how my Custom ViewPager code is

    public class CustomPager extends ViewPager {
    CustomPager mCustomPager;
    private boolean forSuper;
    
    public CustomPager(Context context) {
        super(context);
    }
    
    public CustomPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        if (!forSuper) {
    
            mCustomPager.forSuper(true);
            mCustomPager.onInterceptTouchEvent(arg0);
            mCustomPager.forSuper(false);
        }
        return super.onInterceptTouchEvent(arg0);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent arg0) {
        if (!forSuper) {
            mCustomPager.forSuper(true);
            mCustomPager.onTouchEvent(arg0);
            mCustomPager.forSuper(false);
        }
        return super.onTouchEvent(arg0);
    }
    
    public void setViewPager(CustomPager customPager) {
        mCustomPager = customPager;
    }
    
    public void forSuper(boolean forSuper) {
        this.forSuper = forSuper;
    }
    
    @Override
    public void setCurrentItem(int item, boolean smoothScroll) {
        if (!forSuper) {
            mCustomPager.forSuper(true);
            mCustomPager.setCurrentItem(item, smoothScroll);
            mCustomPager.forSuper(false);
        }
        super.setCurrentItem(item, smoothScroll);
    }
    
    @Override
    public void setCurrentItem(int item) {
        if (!forSuper) {
            mCustomPager.forSuper(true);
            mCustomPager.setCurrentItem(item);
            mCustomPager.forSuper(false);
        }
        super.setCurrentItem(item);
    
    }
    
    }
    

    And you have to set pagers like this before adapter is set and just after getting reference using the ID.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        backPager=(CustomPager) findViewById(R.id.BackPager);
        frontPager = (CustomPager) findViewById(R.id.frontPager);
        frontPager.setViewPager(backPager);
        backPager.setViewPager(frontPager);
        backPager.setAdapter(your Adapter);
        frontPager.setAdapter(your Adapter);
    }
    

    Must set ViewPagers before assigning adapter.

提交回复
热议问题