ViewPager setCurrentItem(pageId,true)不会smoothscroll

Cod*_*oid 45 android android-layout

我正在编译SDK 4.03,三星Infuse Android 2.2,Android 4支持库,并在我的应用程序中使用ViewPager,实际刷卡工作正常,但当我做

viewPager.setCurrentItem(id); // , or
viewPager.setCurrentItem(id, true);  
Run Code Online (Sandbox Code Playgroud)

它不会平滑滚动,但会立即切换视图.虽然文档明确指出这是将第二个参数设置为true的目的.怎么了?

Mar*_*ele 42

我通过创建一个使用反射覆盖ViewPager.mScroller的MyViewPager来解决这个问题.

public class MyViewPager extends ViewPager {

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        setMyScroller();
    }

    private void setMyScroller() {
        try {
            Class<?> viewpager = ViewPager.class;
            Field scroller = viewpager.getDeclaredField("mScroller");
            scroller.setAccessible(true);
            scroller.set(this, new MyScroller(getContext()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public class MyScroller extends Scroller {
        public MyScroller(Context context) {
            super(context, new DecelerateInterpolator());
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            super.startScroll(startX, startY, dx, dy, 1000 /*1 secs*/);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 唯一的问题是如果你在移动过程中再次滑动,它将停止并且用户体验是非常的 (6认同)

小智 16

这就是我做的.我通过将自己的自定义子类放在同一个包smoothScrollToViewPager来覆盖package-private方法.它传递的值为零,这会导致捕捉行为而不是平滑滚动.

package android.support.v4.view;

import android.content.Context;
import android.util.AttributeSet;

public class MyViewPager extends ViewPager {

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attr) {
        super(context, attr);
    }

    void smoothScrollTo(int x, int y, int velocity) {
        super.smoothScrollTo(x, y, 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,如果你想要你可以计算并提供仅1的实际速度ISO.

  • 这对我编译很好,但似乎没有效果,滚动仍然几乎是即时的. (3认同)
  • ViewPager类中没有方法smoothScrollTo(int,int,int) (2认同)
  • 有!(如果你将MyViewPager放在android.support.v4.view中) (2认同)

ACe*_*giz 10

setCurrentItem在处理程序中调用了函数,它对我来说很好.

new Handler().post(new Runnable() {
        @Override
        public void run() {
            myViewPager.setCurrentItem(1, true);
        }
    });
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


XNi*_*NJA 6

我知道这个帖子很老了,但这是谷歌的最佳结果之一.我一直在回顾如何解决这个问题.上面的解决方案都没有帮助我.但是,我确实找到了适合我的解决方案.

我目前的设置是viewpager中的listview.当您单击其中一个视图时,它会创建一个新页面并滚动到该页面.这之前非常活泼,但似乎这是因为我在打电话

mViewPager.setCurrentItem(intIndex, true);
Run Code Online (Sandbox Code Playgroud)

来自我的OnClickEvent.由于某种原因,viewpager不喜欢这个,所以相反,我做了这个功能.它创建了一个在UI线程上运行runnable的新线程.这个runnable告诉ViewPager滚动到某个项目.

public static void scrollToIndex(int index) {

    final int intIndex = index;

    //We're going to make another thread to separate ourselves from whatever
    //thread we are in 
    Thread sepThread = new Thread(new Runnable(){

        public void run()
        {
            //Then, inside that thread, run a runnable on the ui thread.
            //MyActivity.getContext() is a static function that returns the 
            //context of the activity. It's useful in a pinch.
            ((Activity)MyActivity.getContext()).runOnUiThread(new Runnable(){

                @Override
                public void run() {

                    if (mSlidingTabLayout != null)
                    {
                        //I'm using a tabstrip with this as well, make sure
                        //the tabstrip is updated, or else it won't scroll
                        //correctly
                        if(mSlidingTabLayout.getTabStripChildCount() <= intIndex)
                        mSlidingTabLayout.updateTabStrip();

                        //Inside this thread is where you call setCurrentItem
                        mViewPager.setCurrentItem(intIndex, true);

                    }

                }

            });

         }
    });


    sepThread.start();


}
Run Code Online (Sandbox Code Playgroud)

我希望我至少能帮助解决这个问题的人.祝好运!

编辑:看看我的答案,我很确定你可以运行ui线程,它应该工作.拿着那粒盐,但我还没有测试过.


iTu*_*rki 0

ViewPager 从修订版 5 到修订版 9 发生了很大变化。其中一些更改可能与您的问题有关:

  • ViewPager 中用户界面行为的错误修复(修订版 5 和 6)
  • 修复了 ViewPager(修订版 9)的许多错误

鉴于您的代码应该可以正常工作,我最好的猜测是您的支持库不是最新的。如果不是,请尝试更新库。