gpt4 book ai didi

android - ViewPager 中的 setCurrentItem 不会立即滚动到正确的位置

转载 作者:可可西里 更新时间:2023-11-01 19:08:56 26 4
gpt4 key购买 nike

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

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

我已经尝试修改onPageScrollStateChanged(int arg0),我只有3个 View 并且总是在中间显示。

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;

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

谢谢

最佳答案

我能详细了解一下你想要完成的事情的背景吗?

无论如何,据我所知,您正在尝试制作一个从最后一个到第一个的“无限”ViewPager,反之亦然(如果我错了,请纠正我)。并且您希望您的 ViewPager 转到第一页但滚动 - 而不是突然出现。

好吧,如果你禁用平滑滚动(第二个参数),那么它将直接转到你想要的页面而没有滚动 Action (并且不会在途中“改变”到其他页面),如果你启用平滑滚动然后它将遍历所有 View ,因此您将看到它不是下一个而是第一个。

    /*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 和“last”添加“虚拟” View ,位置 0 的 View 将与位置“last - 1”相同,并且“最后” View 与位置“1”相同。所以你将做一切正常的事情,除了在 OnPageChangeListener 上你将检查当前页面是位置“0”还是“last”,如果是,你将调用 setCurrentItem("1", false) 或 setCurrentItem("last - 1", false) 取决于你现在所处的位置。通过这种方式,您将在完成您想要的操作的同时保持“页面更改”效果。

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

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

更新:

如果更改决定 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 已经针对处理这些情况进行了优化,在我的例子中,我有很多元素,它工作得很好。

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

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

更新 3:

嗯,我唯一可以推荐的是有一个列表,您可以在其中不断添加从数据库中获取的新对象,然后只要您不断将对象插入到列表的末尾就没有问题。如果你想在中间或开头添加对象,那么你需要调用 notifyDataSetChanged 但这会有点慢,因为它会再次生成 View 。我们这样做并且它完美地工作,我们甚至从服务器下载信息,数据不是本地的(实际上我们将信息添加到列表的末尾和开头)。

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

更新 4:

以防万一有人真的在寻找一个循环ViewPager,我添加了一个proof of concept code你可以重复使用。它工作没有问题,我已经将它用于复杂的 View ,仍然没有任何延迟。

关于android - ViewPager 中的 setCurrentItem 不会立即滚动到正确的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12008716/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com