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)
小智 16
这就是我做的.我通过将自己的自定义子类放在同一个包smoothScrollTo中ViewPager来覆盖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.
ACe*_*giz 10
我setCurrentItem在处理程序中调用了函数,它对我来说很好.
new Handler().post(new Runnable() {
@Override
public void run() {
myViewPager.setCurrentItem(1, true);
}
});
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
我知道这个帖子很老了,但这是谷歌的最佳结果之一.我一直在回顾如何解决这个问题.上面的解决方案都没有帮助我.但是,我确实找到了适合我的解决方案.
我目前的设置是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线程,它应该工作.拿着那粒盐,但我还没有测试过.
ViewPager 从修订版 5 到修订版 9 发生了很大变化。其中一些更改可能与您的问题有关:
鉴于您的代码应该可以正常工作,我最好的猜测是您的支持库不是最新的。如果不是,请尝试更新库。
| 归档时间: |
|
| 查看次数: |
36432 次 |
| 最近记录: |