我可以更多地了解您要完成的工作的背景吗?
无论如何,据我所知,您正在尝试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
,我添加了一个可以重复使用的概念验证代码。它可以毫无问题地工作,我已经将它用于复杂的视图,并且仍然没有任何延迟。