1

i am displaying images using viewpager and that images will be automatically change after 20 seconds automatically changes images every 20 seconds work perfectly but i want to reset handler postdelayed time if user manually scroll pager and next image should be display 20 seconds

Current Working : if i am on the first position of viewpager for display image this image time is 20 seconds after 10 seconds if i scrollpage than next image is display is only 10 seconds but it should be display 20000 seconds

how to update post delayed time for next image display check below code what i have tried.

onpageselected i have set again post delayed but it was not worked

Thanks

final int []sliderImageArray={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e};

    runnable = new Runnable()
    {

        //int i=0;
        public void run()
        {   // slider image run

                if(startt)
                {   


                    if(i==0)
                    {   
                     viewPager.setCurrentItem(i,false);
                    } 
                    else
                    {
                        viewPager.setCurrentItem(i,false);
                    }
                    i++;
                    if(i>sliderImageArray.length-1)
                    {
                        i=0;    
                    }

                }
                else
                {

                }

            imagehandler.postDelayed(this, 20000); 
        }

    };
    imagehandler.postDelayed(runnable,20000);

.

viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {


                i=arg0;
                imagehandler.postDelayed(runnable, 20000);
                Log.d("onpageselected","----->"+arg0);

            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {


            }
        });
Mahesh
  • 1,559
  • 6
  • 27
  • 57

3 Answers3

2

You should call the imagehandler in onPageScrollStateChanged. So call imagehandler.postDelayed if the ViewPager is in the process of settling to the next position and call imagehandler.removeCallbacks if the ViewPager is being dragged by the user ViewPager Scroll-States.

Here is an example implementation:

final int[] sliderImageArray = new int[] { R.drawable.a, R.drawable.b,
        R.drawable.c, R.drawable.d, R.drawable.e };
private Runnable imageSliderRunnable = new Runnable() {
    @Override
    public void run() {
        final int itemCount = sliderImageArray.length;
        final int currentItem = viewPager.getCurrentItem();
        final int nextItem = (currentItem + 1) % itemCount;
        viewPager.setCurrentItem(nextItem, false);
    }
};

private void setupViewPager() {
    this.viewPager
            .setOnPageChangeListener(new SimpleOnPageChangeListener() {
                @Override
                public void onPageScrollStateChanged(int state) {
                    switch (state) {
                    case ViewPager.SCROLL_STATE_DRAGGING:
                        imagehandler.removeCallbacks(imageSliderRunnable);
                        break;
                    case ViewPager.SCROLL_STATE_SETTLING:
                        imagehandler.removeCallbacks(imageSliderRunnable);
                        imagehandler.postDelayed(imageSliderRunnable, 20000);
                        break;
                    }
                }
            });
    imagehandler.postDelayed(imageSliderRunnable, 20000);
}

Don´t forget to remove the callbacks from the handler if enclosing Activity or Fragment will be paused.

@Override
public void onResume() {
    super.onResume();
    setupViewPager();
}

@Override
public void onPause() {
    imagehandler.removeCallbacks(imageSliderRunnable);
    super.onPause();
}
David Boho
  • 2,646
  • 20
  • 17
0

Try do this

imagehandler.removeCallbacksAndMessages(null);
imagehandler.postDelayed(this, 20000); 
vmtrue
  • 1,724
  • 18
  • 36
  • if i set his onpage change listener it gives me error like The method postDelayed(Runnable, long) in the type Handler is not applicable for the arguments (new ViewPager.OnPageChangeListener(){}, int) – Mahesh Sep 18 '14 at 06:22
0

Here you can do like this way

private int runnableMill = 20000;

now use this object

imagehandler.postDelayed(runnable, runnableMill);

update time

runnableMill = 10000;

On the next execution it will be use new value to execute your thread

Pratik
  • 30,639
  • 18
  • 84
  • 159
  • hi @Override public void onPageSelected(int arg0) { i=arg0; runnableMill = 20000; imagehandler.postDelayed(runnable, runnableMill); Log.d("onpageselected","----->"+arg0); } i used something like this current scrolled image display correct time but when autoscroll work it will take other time – Mahesh Sep 18 '14 at 06:38
  • you need to use this object in all the postdelay and when you want to change the time then first call removeCallback(runnable) and then call postdelay method – Pratik Sep 18 '14 at 06:44
  • sorry i try this but for next image is work after that time duration automatically change not working – Mahesh Sep 18 '14 at 11:41