建议的解决方案是正确的,但要获得结果,您需要将 viewpager 的初始值设置为 Integer.MAX_VALUE/2。
无论如何,我不太喜欢这种解决方案,将 getCount 设置为返回 Integer.MAX_VALUE 会对应用程序性能产生巨大影响。
为了避免这个问题,我想出了一个解决方案:
onPageScrollStateChanged 监听器
我只是重新排序片段列表,更新 viewPager 并移动到没有动画的新页面,结果是双向循环:
mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
{
Boolean first = false;
Boolean last = false;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{}
@Override
public void onPageSelected(int position)
{
if (position == 0)
{
first = true;
last = false;
}
else if (position == mainFragmentList.size() -1)
{
first = false;
last = true;
}
else
{
first = false;
last = false;
}
}
@Override
public void onPageScrollStateChanged(int state)
{
if (first && state == ViewPager.SCROLL_STATE_IDLE)
{
// Jump without animation
Fragment fragment = mainFragmentList.get(mainFragmentList.size() -1);
mainFragmentList.remove(mainFragmentList.size() -1 );
mainFragmentList.add(0,fragment);
mainPagerAdapter.setData(mainFragmentList);
mainPagerAdapter.notifyDataSetChanged();
Log.e(TAG,mainFragmentList.toString());
mainViewPager.setCurrentItem(1,false);
}
if(last && state == ViewPager.SCROLL_STATE_IDLE)
{
// Jump without animation
Fragment fragment = mainFragmentList.get(0);
mainFragmentList.remove(0);
mainFragmentList.add(fragment);
mainPagerAdapter.setData(mainFragmentList);
mainPagerAdapter.notifyDataSetChanged();
Log.e(TAG,mainFragmentList.toString());
mainViewPager.setCurrentItem(mainFragmentList.size()-2,false);
}
}
});
这就是这里发生的事情:
在这个例子中,我们有 4 个片段 A-B-C-D
如果用户在片段 A(第一个)上,则新列表将变为:D-A-B-C
[删除最后一个并作为第一个推送]
我更新 ViewPager 并再次移动(没有动画)到片段 A 所以索引 1。
现在用户可以继续向左滚动,会找到片段D。
与最后一个片段相同:
从 A-B-C-D 重新开始
如果用户在片段 D(最后一个)上,则新列表将变为:B-C-D-A
[删除第一个并推最后一个]
我更新 ViewPager 并再次移动(没有动画)到片段 D,以便索引 mainFragmentList.size()-2。
现在用户可以继续向右滚动,将找到片段 A。
记得实现 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter