Search code examples
androidandroid-viewpagertimertask

Control View Pager Slides with Timer Task


I'm trying to slide my ViewPager automatically via using TimerTask class, seems I do not have proper delay and period, it is sliding so fast. I tried all possible combinations of delay and period parameters without any luck, still so annoying fast sliding. Below is the code:

class SliderTimer extends TimerTask {
    @Override
    public void run() {
        HomeActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (viewPager.getCurrentItem() < listSlides.size() - 1) {
                    viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                } else {
                    viewPager.setCurrentItem(0);
                }
            }
        });
    }
}

And the implementations:

Timer timer = new Timer();
timer.scheduleAtFixedRate(new HomeActivity.SliderTimer(), 10000, 10000);

Please guide me, what best can be done for the same.


Solution

  • I think Using Handler is better then TimerTask in this case if ViewPager can slide manually too. First Create a Handler and Runnable Globally.

    private Handler handler=new Handler();
    private Runnable runnable=new Runnable() {
        @Override
        public void run() {
            if(pagerSlider.getCurrentItem()==data.size()-1){
                pagerSlider.setCurrentItem(0,false);
            }else{
                pagerSlider.setCurrentItem(pagerSlider.getCurrentItem()+1);
            }
        }
    };
    

    Post the runnable inside onPageChange.

     pagerSlider.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                handler.removeCallbacks(runnable);
                handler.postDelayed(runnable,2000);
            }
        });
    

    You need to post for first time Rest the listener will do. Change the delay as per your need :-

    handler.postDelayed(runnable,2000);
    

    I just realize that you might be asking about scrolling velocity . Well for this you need to use Customize Scroller. Go to This thread.