在viewpager android中滚动页面时,更新runnable的postdelay秒数?

时间:2014-09-18 06:06:31

标签: android android-viewpager runnable postdelayed

我正在使用viewpager显示图像,并且图像将在20秒后自动更改,每20秒自动更改图像完美工作但我想重置处理程序后延时间,如果用户手动滚动寻呼机,下一图像应显示20秒

当前工作: 如果我在viewpager的第一个位置显示图像,则此图像时间为20秒 10秒后如果我滚动下一个图像显示只有10秒但它应该显示20000秒

如何更新下次图像显示的延迟时间 检查下面代码我试过的。

onpageselected我已经设置了延迟但是没有工作

由于

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


            }
        });

3 个答案:

答案 0 :(得分:2)

您应该在onPageScrollStateChanged中调用imagehandler。 如果ViewPager正在处理到下一个位置,请致电imagehandler.postDelayed,如果用户ViewPager Scroll-States正在拖动ViewPager,请致电imagehandler.removeCallbacks

以下是一个示例实现:

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

如果暂停包含Activity或Fragment,请不要忘记从处理程序中删除回调。

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

@Override
public void onPause() {
    imagehandler.removeCallbacks(imageSliderRunnable);
    super.onPause();
}

答案 1 :(得分:0)

尝试这样做

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

答案 2 :(得分:0)

你可以这样做

private int runnableMill = 20000;

现在使用此对象

imagehandler.postDelayed(runnable, runnableMill);

更新时间

runnableMill = 10000;

在下一次执行时,它将使用新值来执行你的线程