ViewPager中的setCurrentItem不能立即滚动到正确位置

问题描述:

我使用PagerAdapter。我有很多元素,所以我不会在同一时间加载所有元素。我重新加载适配器,我通过新元素更改旧元素。例如,我有4个元素,当我到达最后一个元素时,我重新加载元素,然后调用setCurentItem(1)以便能够将viewpager显示在位置1上。我做了很多测试。我把:ViewPager中的setCurrentItem不能立即滚动到正确位置

viewPager.setCurrentItem(1,false); //But not scroll, put drastically the new page. 
viewPager.setCurrentItem(1); 

我试图修改onPageScrollStateChanged(INT为arg0),我只有3次,并在中间总是ubicate。

if (arg0 == ViewPager.SCROLL_STATE_DRAGGING) { 
    if(focusedPage==2) { 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 

    }else if(focusedPage==0){ 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 
    } 

而且我tryed修改使用onPageSelected(INT为arg0)

focusedPage=arg0; 

利用这最后的例子,我有立即滚动意见,但它始终位于最后一个页面上。任何人都知道我可以如何滑动。

谢谢

我可以更多地了解你所要完成什么样的背景?

无论如何,从我能理解的你试图使一个“无限”ViewPager从最后一个到第一个,反之亦然(请纠正我,如果我错了)。你希望你的ViewPager去第一页,但滚动 - 不只是从无处出现。那么,如果你禁用了平滑滚动(第二个参数),那么它将直接进入你想要的没有滚动运动的页面(并且不会“改变”到其他页面),并且如果你启用平滑滚动,然后它会通过所有的意见,所以你会看到它不是下一个,但第一个。

/*No swipe animation, and no onPageChanged for the page in the middle*/ 
    mPager.setCurrentItem(1, false); 

    /*The same as if you do not add the second parameter*/ 
    mPager.setCurrentItem(1, true); 

    /*Your ViewPager scrolls through all the needed views until it arrives at that view.*/ 
    mPager.setCurrentItem(1); 

我能记住推荐给你,这是你可以尝试添加在位置0“虚拟”视图和“最后”,并认为在位置0是一样的位置“最后 - 1“和”最后“视图将与位置”1“相同。所以你会做一切正常的事情,除了OnPageChangeListener你会检查当前页面是位置“0”还是“最后”,如果是,你会调用setCurrentItem(“1”,false)或setCurrentItem(“last - 1“,假)取决于你现在在哪个位置。通过这种方式,您可以在完成所需功能的同时保持“换页”效果。

我希望这可以帮助你解决你的问题。

注: 它可能有一个laggy改变你在新的位置后到达,因为它必须加载当前,未来和过去的观点认为(或者,如果你是4.0+那么它将只加载实际位置)。

UPDATE:

如果更改列表/阵列决定了ViewPager的内容的内容,你需要调用:

ViewPager mPager = new ViewPager(); 
mPager.getAdapter().notifyDataSetChanged(); //This notify that you need to recreate the views 

/*This is if you want to change the data and then go to a specific position 
If you do not do this you will have a very Buggy Behavior*/ 
new Handler().post(new Runnable() { 
@Override 
public void run() { 
    mPager.setCurrentItem(2); //Where "2" is the position you want to go 
    } 
}); 

更新2:

为什么不将所有元素都添加到ViewPagerViewPager已经为处理这些案件进行了优化,在我的情况下,我有很多元素,它的工作就像一个魅力。

另一件事,在您的代码中,我看到您每次页面“安定”时都会切换到中间页面。但是,你真的从不展示正确的和左边的观点,那么你为什么拥有它们呢?

最后一件事,当您更改数据集时,需要调用上面提到的“notifyDataSetChanged”方法,然后在处理程序中调用“setCurrentItem”方法。如果你不这样做,你的应用程序将无法按预期工作。

更新3:

好了,我可以推荐是有,你不断增加,你从数据库中带来的,然后只要你保持插入对象的新对象列表中的唯一的事情列表的结尾没有问题。如果你想在中间或开始处添加对象,那么你需要调用notifyDataSetChanged,但这样会很慢,因为它会再次生成视图。我们这样做,它完美的工作,我们甚至从服务器下载信息,数据不是本地的(实际上,我们将信息添加到列表的结尾和开始)。

如果您有任何其他问题关于如何实现这一点不要犹豫,问。

UPDATE 4:

万一有人实际上是寻找一个圆形ViewPager,我添加了一个proof of concept code,你可以重新使用。它的工作原理没有问题,我用它来表达复杂的观点,而且没有任何延迟。

+0

感谢@Jorge阿吉拉尔。我用过你的想法,但我改变了一些东西。我添加了“虚拟”视图,但我有不同的看法。例如,如果我有a,b,c,d,e。我已经第一次了:a,a,a。和setCurrentItem(1,false)。当用户滚动到下一个viewpager时,它是:a,b,c和setCurrentItem(1,false),...在onPageScrollStateChanged我已经把这个代码。但现在我有一个小问题。如果用户想快速滚动,他们不能,因为有任何延迟。你有什么主意吗?谢谢 – MARM 2012-08-21 08:58:09

+0

您是否可以编辑您的问题或发布有关新问题的更多详细信息的新问题,以更好地了解您并更好地帮助您。我已经更新了答案以添加一些有价值的东西。如果您可以将此标记为任何人进入的答案,他们可以知道已解决。 – 2012-08-21 15:11:25

+0

我编辑了我的问题。 – MARM 2012-08-21 16:02:35

它不无postDelayed工作,请尝试使用此代码:

viewPager.postDelayed(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     viewPager.setCurrentItem(num, true); 
    } 
}, 100);