首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewPager setCurrentItem(pageId,true)不能平滑滚动

ViewPager setCurrentItem(pageId,true)不能平滑滚动
EN

Stack Overflow用户
提问于 2012-08-15 07:25:02
回答 13查看 39.8K关注 0票数 49

我在SDK4.03,Samsung Infuse Android2.2,Support Library for Android4上编译,并在我的应用程序中使用ViewPager,实际滑动工作正常,但当我这样做时

代码语言:javascript
复制
viewPager.setCurrentItem(id); // , or
viewPager.setCurrentItem(id, true);  

它不会平滑滚动,但会立即切换视图。尽管文档清楚地说明了这就是将第二个参数设置为true的目的。这是怎么回事?

EN

回答 13

Stack Overflow用户

发布于 2013-03-21 22:07:41

我已经通过创建一个使用反射覆盖ViewPager.mScroller的MyViewPager修复了这个问题。

代码语言:javascript
复制
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*/);
        }
    }
}
票数 43
EN

Stack Overflow用户

发布于 2013-02-08 23:45:42

这就是我所做的。我通过将自己的自定义子类放在同一个包中,覆盖了ViewPager中的包私有方法smoothScrollTo。传递给它的值为零,这会导致捕捉行为,而不是平滑滚动。

代码语言:javascript
复制
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);
    }
}

它工作得很好,如果你愿意,你可以计算并提供仅为1的实际速度ISO。

票数 16
EN

Stack Overflow用户

发布于 2015-11-02 17:06:28

我在一个处理程序中调用了setCurrentItem函数,它对我来说工作得很好。

代码语言:javascript
复制
new Handler().post(new Runnable() {
        @Override
        public void run() {
            myViewPager.setCurrentItem(1, true);
        }
    });

希望这能有所帮助。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11962268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档