Reputation: 1589
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
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
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
Reputation: 1774
Try do this
imagehandler.removeCallbacksAndMessages(null);
imagehandler.postDelayed(this, 20000);
Upvotes: 0