14

我用一个PagerAdapter. 我有很多元素,所以我不会同时加载所有元素。我重新加载适配器,用新元素更改旧元素。例如,我有 4 个元素,当我到达最后一个元素时,我重新加载元素并调用setCurentItem(1)以便能够在第一个位置显示 viewpager。我做了很多测试。我放:

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

我尝试过修改onPageScrollStateChanged(int arg0),我只有 3 个视图,并且始终位于中间。

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

我试图修改onPageSelected(int arg0)

focusedPage=arg0;

使用最后一个示例,我立即滚动视图,但它始终位于最后一页。任何人都知道我如何滑动。

谢谢

4

2 回答 2

53

我可以更多地了解您要完成的工作的背景吗?

无论如何,据我所知,您正在尝试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”还是“last”,如果是,你会调用 setCurrentItem("1", false) 或 setCurrentItem("last - 1", false) 取决于您现在所处的位置。通过这种方式,您将在完成所需内容的同时保持“页面更改”效果。

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

注意: 到达新位置后,它可能会有一个滞后的变化,因为它必须加载当前、下一个和最后一个视图的视图(或者如果你在 4.0+ 上,那么它只会加载实际位置)。

更新:

如果更改确定 内容的 List/Array 的内容,则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:

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

另一件事,在您的代码中,每次页面“稳定”时,我都会看到您更改为中间页面。但是你真的从不显示右视图和左视图,那你为什么要有它们呢?

最后一件事,当您更改数据集时,您需要调用我上面提到的“notifyDataSetChanged”方法,然后在处理程序中调用“setCurrentItem”方法。否则,您的应用程序将无法按预期运行。

更新 3:

好吧,我唯一可以推荐的是有一个列表,您可以在其中不断添加从数据库中带来的新对象,然后只要您继续将对象插入到列表的末尾就没有问题。如果要在中间或开头添加对象,则需要调用 notifyDataSetChanged 但这会有点慢,因为它会再次生成视图。我们这样做并且效果很好,我们甚至从服务器下载信息,数据不是本地的(实际上我们将信息添加到列表的末尾和开头)。

如果您对如何实现这一目标有任何其他问题,请随时提出。

更新 4:

以防万一有人真的在寻找通告ViewPager,我添加了一个可以重复使用的概念验证代码。它可以毫无问题地工作,我已经将它用于复杂的视图,并且仍然没有任何延迟。

于 2012-08-20T22:47:53.373 回答
3

如果没有 postDelayed,它就无法工作,请尝试使用以下代码:

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);
于 2016-09-15T21:24:17.677 回答