Rahul Singh
Rahul Singh

Reputation: 243

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.

Upvotes: 1

Views: 367

Answers (2)

Parth Lotia
Parth Lotia

Reputation: 803

Try this one...

public static final long DELAY_MS = 2000;
public static final long PERIOD_MS = 4000;

new MyTimerHeader(DELAY_MS, PERIOD_MS, viewPager, images_total_length);

public MyTimerHeader(long DELAY_MS, long PERIOD_MS, final ViewPager slider1, final 
int image_name) {
    final int image_name1=image_name;

    final Handler handler = new Handler();
    final Runnable Update = new Runnable() {
        public void run() {

            int currentPage = slider1.getCurrentItem();

            if (currentPage == image_name1 - 1) {
                currentPage = 0;
            }
            else {
                currentPage = currentPage + 1;
            }
            slider1.setCurrentItem(currentPage);
        }



    };

    Timer timer = new Timer(); // This will create a new Thread
    timer .schedule(new TimerTask() { // task to be scheduled

        @Override
        public void run() {

            handler.post(Update);

        }
    }, DELAY_MS, PERIOD_MS);
}

Upvotes: 0

SpiritCrusher
SpiritCrusher

Reputation: 21053

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.

Upvotes: 4

Related Questions