Mahesh
Mahesh

Reputation: 1589

Update postdelay seconds for runnable when page scrolled in viewpager android?

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) {


            }
        });

Upvotes: 1

Views: 1464

Answers (3)

David Boho
David Boho

Reputation: 2716

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();
}

Upvotes: 2

Pratik
Pratik

Reputation: 30855

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

Upvotes: 0

vmtrue
vmtrue

Reputation: 1774

Try do this

imagehandler.removeCallbacksAndMessages(null);
imagehandler.postDelayed(this, 20000); 

Upvotes: 0

Related Questions