我想做的只是Android中的水平旋转木马。
如果我有3个屏幕A B和C,那么我希望我的ViewPager允许我移动 A - < - > B, B - < - > C, C - C - 。甲
GTalk for Android的对话可以像这样切换。 三星的主屏幕和应用程序屏幕可以像这样切换。
B和C是片段,我使用扩展FragmentPagerAdapter的适配器。所有片段都将包含webview。
有人能引导我朝正确的方向前进吗?
答案 0 :(得分:3)
(从相同的StackOverflow问题交叉发布my answer)
一种可能性是设置这样的屏幕:
C'A B C A'
C'看起来就像C,但当你滚动到那里时,它会切换到真正的C. '看起来就像A,但当你滚动到那里时,它会切换到真正的A。
我会通过实施onPageScrollStateChanged来实现这一点:
@Override
public void onPageScrollStateChanged (int state) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
int curr = viewPager.getCurrentItem();
int lastReal = viewPager.getAdapter().getCount() - 2;
if (curr == 0) {
viewPager.setCurrentItem(lastReal, false);
} else if (curr > lastReal) {
viewPager.setCurrentItem(1, false);
}
}
}
请注意,这会调用setCurrentItem的替代形式并传递false
以使跳转立即发生而不是平滑滚动。
我看到了两个主要缺点。首先,在到达任一端时,用户必须让滚动在他们可以走得更远之前解决。其次,它意味着在您的第一页和最后一页中拥有所有视图的第二个副本。根据屏幕资源的大小,这可能会排除这种技术作为一种可能的解决方案。
另请注意,由于视图寻呼机不会让点击进入底层控件直到滚动结束后,因此可能没有为A'和C'片段设置clicklisteners等。
编辑:现在我自己实现了这个,还有一个相当重要的缺点。当它从A'切换到A或C'到C时,屏幕会闪烁片刻,至少在我当前的测试设备上。
答案 1 :(得分:1)
ViewPager设置:
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mViewPager.setAdapter(new YourPagerAdapter(getSupportFragmentManager()));
//Set the number of pages that should be retained to either side of the current page.
mViewPager.setOffscreenPageLimit(1);
mViewPager.setCurrentItem(50);
FragmentPagerAdapter:
public class YourPagerAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 100;
final int REAL_PAGE_COUNT = 3;
public YourPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
while (position > REAL_PAGE_COUNT - 1) {
position = position - REAL_PAGE_COUNT ;
}
switch (position) {
case 0:
return FirstFragment.newInstance(position);
case 1:
return SecondFragment.newInstance(position);
case 2:
return ThirdFragment.newInstance(position);
}
return null;
}
@Override
public int getCount() {
return PAGE_COUNT;
}
}
答案 2 :(得分:0)
像这样实施getItem(int position)
:
public Fragment getItem(int position)
{
switch(position)
{
case 0:
Fragment A = new A();
return A;
case 1:
Fragment B = new B();
return B;
same for C....
}
}
您还可以在这里查看:SimpleViewPager ..下载源代码并了解它。希望它有所帮助。