我尝试使用与PlayStore 5.1.x相同的视图翻页器+选项卡
设计。这是我的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical">
<com.astuetz.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/background_tabs" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
我的适配器:
public class MainPagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<FakeFragment> fragments;
public MainPagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
fragments = new ArrayList<FakeFragment>();
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
if(position < getCount()) {
FakeFragment fragment = FakeFragment.newInstance(position);
fragments.add(fragment);
}
return fragments.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Category.values().length;
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return Category.values()[position].getTitle();
}
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return POSITION_NONE;
}
}
我的选项卡和页面导航显示正确!但是我注意到ViewPager中显示的第一个片段总是与第二个相同。然后当我向左或向右滑动一次或两次并返回第一页时,我发现现在显示了正确的片段!!我不明白为什么会这样,请给我一些解释。
解决方法:问题出在我的FakeFragment.newInstance()方法定义上。
private static int position;
public static FakeFragment newInstance(int position) {
// TODO Auto-generated method stub
FakeFragment.position = position;
return new FakeFragment();
}
我通过在我的
FakeFragment
实例上使用setArguments(args)
,然后在onCreate
方法中检索它来更改了它。现在一切都很顺利!有人能解释一下为什么吗?
我认为,这样做的话,位置的值将完全取决于片段的生命周期,因此位置将始终是预期的位置,对吗?
private ArrayList<FakeFragment> fragments
,只需让getItem()
返回片段的新实例即可。FragmentStatePagerAdapter
的 完整和整个目标 就是不要将所有片段都保留在内存中。如果这是您想要的,请仍然摆脱ArrayList<FakeFragment>
并将适配器切换为FragmentPagerAdapter
而不是FragmentStatePagerAdapter
。同时也可以摆脱getItemPosition()
。顺便说一句,在这里有一系列使用ViewPager
的示例应用程序。 - CommonsWareFragmentStatePagerAdapter
,使用Fragment.onSaveInstanceState
来存储已加载的数据集。 - Eugen Pechanec